计算两个三维点之间距离的算法?

8

我有两个三维点。
例子:

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

有没有一种算法可以计算两点之间的浮点距离?


14
维基百科的黑屏结束后,我们会尽快通知您。 - user208608
2
如果社区无法在没有谷歌搜索的情况下回答这个问题,那么世界注定要失败。这让我想起一个问题:为什么你没有谷歌搜索呢? - Jon
5个回答

25

两个三维点之间的欧几里得距离为:

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);
}

编辑:我更倾向于下面dasblinkenlight发布的Zip解决方案!


@JohnBoker:已修复,谢谢。此外,这个问题在SO上已经被问了很多次... - Ron Warholic
我更喜欢你的方法。在我的机器上(不包括开销),它只需要60毫秒,而linq解决方案则需要541毫秒(大约进行了400万次计算)。我确实同意linq非常优雅,但也很昂贵。对于我的用途,我更喜欢传统的经典方法。感谢您的帮助! - Florin Mircea

20
在C#中使用LINQ,您可以这样做:
var dist = Math.Sqrt(point1.Zip(point2, (a, b) => (a - b)*(a - b)).Sum());

这段代码计算每个坐标之间平方差的总和,并返回该总和的算术平方根。

编辑: 这个解决方法适用于任意大于等于1维度的数量(感谢Austin Salonen指出)。


非常好的n维解决方案。 - Austin Salonen
这看起来很棒啊,一行就搞定了:D 你测试过确保它能正常工作吗? - Furkan Gözükara
@MonsterMMORPG 当 point1point2 的大小匹配时,除了产生平方差之和的平方根外,它别无选择 :-) - Sergey Kalinichenko

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))

这段代码是计算两个点之间的三维距离。其中,point1point2分别表示两个点的坐标,Math.Pow()函数用于计算次方,Math.Sqrt()函数用于计算平方根。最后得出的结果是一个浮点数类型的距离值。

4

类似于二维,但多了一个坐标:

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)
P2 = (x2, 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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接