如果不规则多边形和该多边形内的点,如何确定多边形中哪条边最接近该点?
我可能不得不对多边形内的一大组点进行此计算(例如50-200点)。
答案 0 :(得分:17)
该算法的每一步都是线性时间(O(n))。
以下是每个步骤的基本公式:
计算与多边形每条边相切的直线上的最近点。
p1 = {x1, y1}
。p2 = {x2, y2}
。p3 = {x3,y3}
。u
为p1和p2之间距离的百分比,这是找到由p1和p2形成的线上的点所需的,这样p1+u(p2-p1)
=该行上的点最接近p3(此点和p3之间的线段也恰好垂直于通过p1和p2的线)。u = ((x3 - x1)(x2 - x1)+(y3 - y1)(y2 - y1)) / ((x2 - x1)^2 + (y2 - y1)^2)
pu = {xu, yu}
xu = x1 + u (x2 - x1)
yu = y1 + u (y2- y1)
pu = {xu, yu}
计算每个线段(多边形边缘)上最近的点到相关点。
点pu
只是0 <= u <= 1
时线段上最近的点。否则,线段的适当端点是与该点最近的点。因此,对于在上述步骤中计算的每个pu, p1, p2, and u
,请执行以下操作:
Let pc = {xc, yc}
被表示为多边形边线的线段上与该点之间的最近点。IF u<0 THEN pc = p1
ELSE IF u>1 THEN pc = p2
ELSE pc = pu
计算从每个线段上最近点到相关点的距离。
p3
与pc
=`sqrt之间的距离((x3 - xc)^ 2 +(y3 - yc)^ 2)找到最小距离。具有最小距离的相应多边形是答案。
以下图表可帮助您了解此帖中的要点和术语:
...
答案 1 :(得分:1)
正确答案取决于问题的大图结构:当您考虑多个查询时会发生什么?我假设每个查询将处理不同的点。但是多边形怎么样?您是否希望收到同一多边形的多个查询?或者每次多边形不同?
如果每个查询都应用于不同的,不可预测的多边形,那么您唯一的解决方案就是对所有多边形边缘进行全面检查,并对每个边缘进行点对点距离测试。它可以以各种[启发式]方式进行优化(尽早丢弃不必要的测试),但在最坏的情况下,没有办法完成整个测试。
但是,如果您希望在问题的多边形一侧具有某种可预测性和稳定性(对同一多边形或一组固定多边形进行足够多的点查询),则情况会发生显着变化。在这种情况下,最好的方法是在多边形内预先构建基于边缘的Voronoi图。然后,您可以解决点位置问题(已知有效算法),以确定查询点落入哪个Voronoi区域。这将立即告诉你哪个边缘最接近。
当您需要处理对同一多边形的许多点查询时,后者的效率要高得多,但需要付出相当大的努力才能实现。所以,这一切都取决于你需要什么样的解决方案。
P.S。我看到你在你的问题中说明你将为一个多边形的大量点运行它。这立即使基于Voronoi图的解决方案成为可能。算法的额外细微差别可能取决于是否提前完全知道大量的点或以不可预测的方式逐点到达。
答案 2 :(得分:0)