Abaduaber

Points

Sep 23rd, 2014
576
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.26 KB | None | 0 0
  1. Type
  2.     {Структура для хранения одной точки.}
  3.     tPoint = Record
  4.       fXP: Real;   {Координата X}
  5.       fYP: Real;   {Координата Y}
  6.       fZP: Real;   {Координата Z}
  7.       fMaxDistance: Real;  {Дистанция до самой удаленной точки от этой}
  8.       fMaxDistancePointIndex: Integer; {Индекс самой удаленной точки от этой}
  9.     End;
  10. Const
  11.     N = 15;        {Количество точек}
  12.     Range = 500;   {Диапазон возможного расстояния от нулевой}
  13.                    {координаты для каждой оси }
  14. Var
  15.     gaPoints: Array [1..N] Of tPoint; {Массив с точками}
  16.     I, J, CurIndex: Integer;  {Индексы массива}
  17.     {Вспомогательные переменные - текущее максимальное расстояние и расстояние}
  18.     CurMaxDistance, CurDistance: Real;
  19.  
  20. {Функция считает по данной тобой формуле расстояние между двумя точками}
  21. Function CalcDistance(Var aFirstPoint: tPoint; Var aSecPoint: tPoint): Real;
  22. Begin
  23.     With aFirstPoint Do Begin
  24.       CalcDistance:= Sqrt(
  25.         Sqr(fXP - aSecPoint.fXP) +
  26.         Sqr(fYP - aSecPoint.fYP) +
  27.         Sqr(fZP - aSecPoint.fZP)
  28.       );
  29.     End;
  30. End;
  31.  
  32. Begin
  33.     Randomize;   {Задаем сид для генератора случайных чисел}
  34.     {Заполняем массив точек, высчитывая координаты каждой точки случайно}
  35.     For I:= 1 To N Do With gaPoints[I] Do Begin
  36.       fXP:= Range - Random(Range * 2);
  37.       fYP:= Range - Random(Range * 2);
  38.       fZP:= Range - Random(Range * 2);
  39.       fMaxDistancePointIndex:= 0; {Пока не нашли, поэтому нули}
  40.       fMaxDistance:= 0;
  41.     End;
  42.     {А теперь самое главное: Для каждой точки массива мы прокручиваем во внутреннем
  43.     цикле по I все остальные точки, кроме нее же, пытаясь обнаружить точку, самую
  44.     отдаленной от точки с индексом J}
  45.     For J:= 1 To N Do Begin
  46.       CurMaxDistance:= 0; {Пока дистанцию занулим}
  47.       For I:= 1 To N Do Begin  {И пройдемся по остальным точкам}
  48.         If I = J Then Continue;  {Если наткнулись на эту же точку, то незачем
  49.          проверять, насколько она удалена от самой себя - перейдем к следующей точке}
  50.         CurDistance:= CalcDistance(gaPoints[I], gaPoints[J]); {Узнаем дистанцию}
  51.         {Если текущая максимальная дистанция, которую мы обнаружили меньше, чем
  52.          та, которую мы посчитали, то значит, мы нашли точку более удаленную от точки
  53.          J, и следует обновить для этой точки информацию о ее самой далекой соседке}
  54.         If CurMaxDistance < CurDistance Then With gaPoints[J] Do Begin
  55.           CurMaxDistance:= CurDistance;
  56.           fMaxDistancePointIndex:= I;
  57.           fMaxDistance:= CurMaxDistance;
  58.         End;
  59.       End;
  60.     End;
  61.     {Итак, после кода, который был выше, каждая точка знает, какая точка дальше всех
  62.     от нее. Она знает ее номер в массиве и дистанцию до этой точки.
  63.     Остается найти такую точку, у которой дистанция ее самой далекой соседки максимальна}
  64.     CurMaxDistance:= gaPoints[1].fMaxDistance;
  65.     For I:= 1 To N Do With gaPoints[I] Do Begin
  66.       If CurMaxDistance > fMaxDistance Then Begin
  67.         CurMaxDistance:= fMaxDistance;
  68.         CurIndex:= I;
  69.       End;
  70.     End;
  71.     WriteLn('Points #', CurIndex, ' and #',
  72.       gaPoints[CurIndex].fMaxDistancePointIndex,
  73.       ' has maximum distance between each other');
  74. End.
Advertisement
Add Comment
Please, Sign In to add comment