Евклидово расстояние между координатами в массиве - PullRequest
0 голосов
/ 09 декабря 2018

Я вычисляю евклидово расстояние в c #.

Point[] points = new Point[100];

У меня есть координаты точек, которые я создал в этом массиве. Я хочу вычислить расстояние между всеми точками.

for (int i = 1; i < k+1; i++)
 {

     X1 = points[i].X;
     X2 = points[i + 1].X;
     Y1 = points[i].Y;
     Y2 = points[i + 1].Y;
     result = Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));

}

С помощью этого кода я вычислил расстояние между точками (например, расстояние между точками a и b, расстояние между точками c и d и т. Д.), Но я не смог рассчитать расстояние между точками a и c или точками b и bЯ хочу рассчитать расстояние между всеми точками в этом массиве.Как мне это сделать?

Ответы [ 4 ]

0 голосов
/ 09 декабря 2018
public void Euclidea()
        {
            double result;
            int X1,X2,Y1,Y2;

            for (int i = 1; i < k+1; i++)
            {
                X1 = points[i].X;
                Y1 = points[i].Y;
                for (int j = 0; j < k; j++)
                {
                    X2 = points[j + 1].X;
                    Y2 = points[j + 1].Y;
                    result = Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
                }
            }
        }

Я решил проблему, набрав этот код k = points.length ()

0 голосов
/ 09 декабря 2018

Вы должны использовать 2 петли.Первый цикл присваивает значения X1, а второй цикл присваивает значения X2.

Это позволяет рассчитать евклидово расстояние между двумя точками, не смежными в массиве.

0 голосов
/ 09 декабря 2018

Вы, вероятно, хотите пройти через массив дважды.

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
    }

Очевидно, вы можете просто запустить два цикла для одинаковой длины, но это даст вам один и тот же результат дважды.Когда 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));
}

Таким образом, я могу в любое время повторно использовать и переупорядочивать свои вычисления, потому что мне нужно только переместить одну строку.Обратите внимание, что вы всегда можете просто использовать поплавки в качестве параметров вместо локальных, но я чувствовал, что этот способ сделает его более читабельным здесь, в этом примере.

Я также пропустил вычисления, когда расстояние было равно, потому чтосравнивались одинаковые значения.

0 голосов
/ 09 декабря 2018

Вы должны использовать 2 для циклов, чтобы достичь этого.

Также вы хотели бы сохранить евклидовы расстояния между этими точками где-то.

...