我有一组构成路径的点。我想确定从任何给定点到此路径的最小距离。路径可能如下所示:
points = [
[50, 58],
[53, 67],
[59, 82],
[64, 75],
[75, 73]
];
其中第一个值是x坐标,第二个值是y坐标。路径是开放式的(它不会形成闭环),并且由点之间的直线段组成。
所以,有一点,例如。 [90, 84]
,如何计算从该点到路径的最短距离?
我不一定在寻找完整的解决方案,但任何指针和想法都会受到赞赏。
答案 0 :(得分:3)
可以构建病理情况,其中到点P的最近线段连接两个点,这两个点本身比路径中的任何其他点更远离P.因此,除非我遗漏了一些非常微妙的东西,否则你必须计算到每个线段的距离,以获得到路径的最短距离。
这是一个简单的例子:
(5,1)-(4,2)-(1,3)-(20,3)-(15,2)-(14,1)
给定点(10,1),到路径的最近距离将是沿着线段(1,3) - (20,3)的点(10,3),但是这两点距离(10,1)远远超过路径中的任何其他点。
所以我不相信天真的算法有任何捷径可以找到每个线段的距离并采取最小值。
答案 1 :(得分:1)
点与线之间的距离由下式给出:
d = |(x_2 - x_1)(y_1 - y_0) - (x_1 - x_0)(y_2 - y_1)| / sqrt((x_2 - x_1)^ 2 - (y_2 - y_1)^ 2),
是点积的扩展,其中(x_0,y_0)是该点的坐标,并且(x_1,y_1)& (x_2,y_2)是该行的端点。
为每组点计算这个非常简单,然后确定哪一个是最低点。我并不相信没有更优雅的方式这样做,但我不知道。虽然我很想看看有人在这里回答一个问题!
编辑:对不起,这里的数学看起来很乱,没有格式化。这是一个关于这个等式看起来像的图像,做得很好:
另一个编辑:正如克里斯在他的帖子中指出的那样,如果点是直线的,即如果线由(0,0) - (0,1)定义并且点由(0,10)。就像他解释的那样,你需要检查以确保正在查看的点实际上并不在线本身的“扩展路径”上。如果是,则它只是较近端点和点之间的距离。所有归功于克里斯!
答案 2 :(得分:1)
从点C到线段AB的距离是平行四边形ABCC'的区域。
答案 3 :(得分:1)
所以,我只想了一下。 erekalper已经发布了一个点和一条线之间的距离。但是,这个公式的问题在于它假设线条具有无限长度,而问题并非如此。只是问题的一个例子:假设一条从(0,0)到(0,1)的简单线和一个坐标为(0,10)的点。上面公布的公式将返回距离0,因为如果你延长线,它将达到这一点。不幸的是,在你的情况下,行结束于(0,1),因此距离实际上是9。
因此我的算法是:检查线的端点处的角度是否<= 90°。如果是这样,该路径的最短距离将由已发布的公式计算。如果不是,则最短距离是到一个端点的距离。对路径的所有部分执行此操作,选择最小
答案 4 :(得分:1)
最好的方法是找到距离线最近的点(制作路径)测量距离并沿路径移动(并将点存储为最短距离)。
答案 5 :(得分:0)
您需要使用线性代数( shivers )来计算从点到每条线的距离。
以下是描述数学的文章的链接:http://mathforum.org/library/drmath/view/55501.html
这是一个pretty good library。您需要查看名为PointSegmentDistance
的方法。 段显然是从一点开始到第二点结束的行,而行 有 两点但继续无限。
答案 6 :(得分:0)
首先,您需要找到每个线段的最短距离,然后选择最小距离。计算最短距离时,需要找出线段中最近的点。如果最近的点不在起点和终点之间,则必须使用起点或终点的距离(以最接近的点为准)。
This page有一些您可能需要的公式。