Составить программу, демонстротирующию затухающие движения горизонтально брошенного мячика - Pascal ABC
Формулировка задачи:
1)Составить программу, демонстротирующию затухающие движения горизонтально брошенного мячика
2)Выбрать три различные точки из заданного множества точек на плоскости так, чтобы была минимальной разность между количествами точек,лежащих внутри и вне треугольника с вершинами в выбранных точках.
Желательно решить хотябы с кратким описанием.
Заранее благодарен.
Решение задачи: «Составить программу, демонстротирующию затухающие движения горизонтально брошенного мячика»
textual
Листинг программы
uses graphABC; const t=0.001; //точность сравнения n=20;//количество точек type point=record x,y:integer; end; function Plosh(a,b,c:point):real;//площадь треугольника по координатам begin Plosh:=abs(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y))/2; end; {проверка внутри или нет} function Prin(a,b,c,d:point):boolean; var s,s1,s2,s3:real; begin s:=Plosh(a,b,c);{площадь данного треугольника} s1:=Plosh(a,b,d);{1 маленький} s2:=Plosh(a,c,d);{2} s3:=Plosh(b,c,d);{3} Prin:=abs((s1+s2+s3)-s)<t;{если площади равны с заданной точностью} end; var m:array[1..n] of point; xc,yc,ms,i,j,k,p,imn,jmn,kmn,kv,kn,mn:integer; s1,s2:string; begin randomize; {центр экрана} xc:=windowwidth div 2; yc:=windowheight div 2; {создаем массив точек, чтобы не считать большие числа, возьмем координаты по х=[-32..32] по y=[-24..24], потом умножим на 10 при рисовании} for i:=1 to n do begin m[i].x:=random(xc div 5)-(xc div 10); m[i].y:=random(yc div 5)-(yc div 10); end; {найдем вершины треугольника с минимальной разницей внутри и снаружи} mn:=n; for i:=1 to n-2 do for j:=i+1 to n-1 do for k:=j+1 to n do if Plosh(m[i],m[j],m[k])>0 then //если треугольник begin kv:=0; kn:=0; for p:=1 to n do if not(p in [i,j,k]) then //вуршины треугольника не считаем begin if (Prin(m[i],m[j],m[k],m[p]))then kv:=kv+1 else kn:=kn+1; end; if abs(kv-kn)<mn then begin mn:=abs(kv-kn); imn:=i; jmn:=j; kmn:=k; end; end; ms:=10;{масштаб} {нарисуем треугольник} setpencolor(clGreen); circle(xc+m[imn].x*10,yc-m[imn].y*10,4); floodfill(xc+m[imn].x*10,yc-m[imn].y*10,clGreen); circle(xc+m[jmn].x*10,yc-m[jmn].y*10,4); floodfill(xc+m[jmn].x*10,yc-m[jmn].y*10,10); circle(xc+m[kmn].x*10,yc-m[kmn].y*10,4); floodfill(xc+m[kmn].x*10,yc-m[kmn].y*10,10); line(xc+m[imn].x*10,yc-m[imn].y*10,xc+m[jmn].x*10,yc-m[jmn].y*10); line(xc+m[jmn].x*10,yc-m[jmn].y*10,xc+m[kmn].x*10,yc-m[kmn].y*10); line(xc+m[imn].x*10,yc-m[imn].y*10,xc+m[kmn].x*10,yc-m[kmn].y*10); {нарисуем точки} kv:=0; kn:=0; for i:=1 to n do begin if Prin(m[imn],m[jmn],m[kmn],m[i]) then {внутри} begin setpencolor(clBlue); kv:=kv+1; end else begin setpencolor(clRed);{снаружи} kn:=kn+1; end; circle(xc+m[i].x*10,yc-m[i].y*10,2); end; str(kv-3,s1);//вершины треугольника не считаем str(kn,s2); textout(10,10,'Внутри='+s1+' снаружи='+s2); end.
Объяснение кода листинга программы
- Объявлены переменные:
- t (точность сравнения)
- n (количество точек)
- point (тип записи для представления точки)
- Plosh (функция для вычисления площади треугольника по координатам)
- Prin (функция для проверки, является ли точка внутри треугольника или нет)
- m (массив для хранения координат точек)
- xc, yc (координаты центра экрана)
- ms (масштаб)
- i, j, k, p (переменные для хранения индексов вершин треугольника)
- s1, s2 (переменные для хранения количества вершин треугольника и точек снаружи треугольника)
- imn, jmn, kmn (переменные для хранения индексов вершин треугольника)
- kn (переменная для хранения количества точек снаружи треугольника)
- s (строка для отображения количества вершин треугольника и точек снаружи треугольника)
- x, y (переменные для получения координат мыши)
- clGreen, clRed, clBlue (константы для задания цвета)
- windowwidth, windowheight (переменные для получения ширины и высоты окна)
- В начале программы случайным образом генерируются координаты для n точек и сохраняются в массиве m.
- Затем происходит поиск треугольника с минимальной разницей внутри и снаружи. Для этого используется вложенный цикл, который проверяет каждую точку внутри треугольника, образованного текущей точкой и двумя другими случайно выбранными точками. Если точка внутри треугольника, то она считается внутренней точкой, иначе - внешней. Количество внутренних и внешних точек сохраняется в переменных kv и kn соответственно.
- После этого находится треугольник с минимальной разницей между количеством внутренних и внешних точек. Для этого используется переменная mn, которая инициализируется значением n и обновляется, если найдена пара точек с более маленькой разницей.
- Затем происходит рисование треугольника и точек. Сначала рисуются три точки, соответствующие вершинам треугольника, затем рисуется контур треугольника.
- После этого рисуются точки, которые находятся внутри треугольника (цвет синий) и точки, которые находятся снаружи (цвет красный).
- В конце программы выводится количество внутренних и внешних точек в виде строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д