2012-01-18 2 views
7

У меня есть два трехмерных пункта.
Пример:Алгоритм расчета расстояния между 2 3-мерными точками?

float[] point1 = new float[3] {1.3919023, 6.12837912, 10.391283}; 
float[] point2 = new float[3] {48.3818, 38.38182, 318.381823}; 

Любой идея для алгоритма для вычисления расстояния в поплавке между точками?

+14

Мы сообщим вам, как только заканчивается затемнение Википедии. – Nathan

+2

Если сообщество не может ответить на этот вопрос без поискового запроса, то мир обречен. Это напоминает мне: почему вы не сделали это в Google? – Jon

ответ

21

евклидова расстояния между двумя 3D точками:

float deltaX = x1 - x0; 
float deltaY = y1 - y0; 
float deltaZ = z1 - z0; 

float distance = (float) Math.Sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); 

И в N измерениях (непроверенный и уязвим к переполнению):

float DistanceN(float[] first, float[] second) { 
    var sum = first.Select((x, i) => (x - second[i]) * (x - second[i])).Sum(); 
    return Math.Sqrt(sum); 
} 

Edit: Я предпочитаю Zip решение Отвечало от dasblinkenlight ниже!

+0

Вы имеете в виду дельта х квадрат вправо? –

+0

Спасибо, сэр. – Headpuster

+0

@JohnBoker: Исправлено, спасибо. Также этот вопрос был задан МНОГО раз здесь, на SO .... –

4

Как 2D, но с более одной координаты:

P1(x1, y1, z1); P2(x2, y2, z2) 

d = SquareRootOf((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2)); 

Очевидно, что не записано в C#, но вы получите идею.

2

Если у Вас есть две точки:
P1 = (x1, y1, z1)
Р2 = (х2, y2, z2)
расстояние SQRT((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)

Таким образом, можно использовать

float deltax = point2[0] - point1[0]; 
float deltay = point2[1] - point1[1]; 
float deltaz = point2[2] - point1[2]; 
float distance = (float) Math.Sqrt(
    (deltax * deltax) + 
    (deltay * deltay) + 
    (deltaz * deltaz)); 
16

В C# с помощью LINQ вы можете сделать это:

var dist = Math.Sqrt(point1.Zip(point2, (a, b) => (a - b)*(a - b)).Sum()); 

Th суммирует квадрат парных различий между отдельными координатами и возвращает арифметический квадратный корень из суммы.

EDIT: Это решение работает для любого количества измерений большего или равного единице (спасибо Austin Salonen за указание).

+0

Очень красивое n-мерное решение –

+0

это выглядит потрясающе одной строкой: D вы проверили, чтобы проверить, работает ли это или нет? – MonsterMMORPG

+0

@MonsterMMORPG Когда размеры 'point1' и' point2' совпадают, у него нет другого выбора, кроме создания квадратного корня из суммы квадратов попарных разностей :-) – dasblinkenlight

10

enter image description here

float distance=(float) Math.Sqrt(Math.Pow(point1[0]-point2[0],2) + Math.Pow(point1[1]-point2[1],2) + Math.Pow(point1[2]-point2[2],2))

Смежные вопросы