Вероятно, вы захотите дважды просмотреть массив.
Point[] points = new Point[100];
for(int i = 0; i < points.Length; i++)
for (int j = points.Length - 1; j >= i; j--)
{
float distance = 0;
if(i != j)
distance = CalculateDistance(points[i], points[j]);
// Do more stuff here
}
Очевидно, вы можете просто запустить два цикла for одинаковой длины, но это даст вам дважды один и тот же результат. Когда i
и j
имеют одинаковое значение перевернутого (i = 10
, j = 15
и более поздние i = 15
и j = 10
), вы выполняете тот же расчет, чтобы получить тот же результат. Чтобы этого не произошло, мой второй цикл выполняет только половину значений, чтобы не повторять вычисления.
Метод CalculateDistance работает точно так же, как и код, который вы написали ранее, в моем случае это следующее:
private static float CalculateDistance(Point point1, Point point2)
{
float X1 = point1.X;
float X2 = point1.Y;
float Y1 = point2.X;
float Y2 = point2.Y;
return (float)Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
}
Таким образом, я могу повторно использовать и переупорядочивать свои вычисления в любое время, потому что мне нужно переместить только одну строку. Обратите внимание, что вы всегда можете просто использовать числа с плавающей запятой в качестве параметров вместо локальных, но я чувствовал, что это сделает его более читаемым здесь, в этом примере.
Я также пропустил вычисления, когда расстояние было равным, потому что сравнивались одинаковые значения.
09.12.2018