Составить программу, демонстротирующию затухающие движения горизонтально брошенного мячика - 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.

Объяснение кода листинга программы

  1. Объявлены переменные:
    • 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 (переменные для получения ширины и высоты окна)
  2. В начале программы случайным образом генерируются координаты для n точек и сохраняются в массиве m.
  3. Затем происходит поиск треугольника с минимальной разницей внутри и снаружи. Для этого используется вложенный цикл, который проверяет каждую точку внутри треугольника, образованного текущей точкой и двумя другими случайно выбранными точками. Если точка внутри треугольника, то она считается внутренней точкой, иначе - внешней. Количество внутренних и внешних точек сохраняется в переменных kv и kn соответственно.
  4. После этого находится треугольник с минимальной разницей между количеством внутренних и внешних точек. Для этого используется переменная mn, которая инициализируется значением n и обновляется, если найдена пара точек с более маленькой разницей.
  5. Затем происходит рисование треугольника и точек. Сначала рисуются три точки, соответствующие вершинам треугольника, затем рисуется контур треугольника.
  6. После этого рисуются точки, которые находятся внутри треугольника (цвет синий) и точки, которые находятся снаружи (цвет красный).
  7. В конце программы выводится количество внутренних и внешних точек в виде строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы