对于不规则多边形中的点,选择最接近该点的边的最有效方法是什么?

| 给定一个不规则多边形和该多边形内的一个点,如何确定多边形中哪个边最接近该点? 我可能必须对多边形中的大量点(例如50-200点)运行此计算。     
已邀请:
         计算与多边形的每个边相切的直线上的最近点。 计算每个线段(多边形的边)上与该点最近的点。 计算从每个线段上最近的点到所讨论点的距离。 找到最小距离。距离最小的相应多边形边就是答案。 该算法的每个步骤都是线性时间(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)
令在由p1和p2形成的线上最接近p3的点称为
pu = {xu, yu}
xu = x1 + u (x2 - x1)
yu = y1 + u (y2- y1)
就像我们在ѭ6之前说的那样 对每个多边形边缘重复这些计算(即替换为新的p1和p2s) 计算每个线段(多边形的边)上与该点最近的点。 当
0 <= u <= 1
时,点
pu
仅是线段上的最近点。否则,线段的适当端点是最接近所讨论点的点。因此,对于在上述步骤中计算出的每个
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) 对所有PC重复此计算 找到最小距离。距离最小的相应多边形边就是答案。 遍历所有距离,直到找到最小的距离。相应的多边形边就是答案。 这是一个图表,可帮助您了解本文中的要点和术语: ....     
        正确的答案取决于问题的整体结构:当您考虑多个查询时会发生什么?我假设每个查询将处理不同的问题。但是多边形呢?您是否希望收到同一多边形的多个查询?还是每次多边形都不相同? 如果将每个查询应用于一个不同的,不可预测的多边形,那么您唯一的解决方案就是对所有多边形边缘进行全面检查,并针对每个多边形进行点到段距离测试。可以通过各种[启发式]方法进行优化(尽早丢弃不必要的测试),但在最坏的情况下,无法进行全面测试。 但是,如果您期望问题的多边形方面具有某种可预测性和稳定性(对同一多边形或一组固定的多边形有足够多的点查询),那么情况将发生巨大变化。在这种情况下,最好的方法是在多边形内部预先构建基于边缘的Voronoi图。然后,您可以解决点定位问题(已知有效的算法),以确定查询点属于哪个Voronoi区域。这将立即告诉您哪个边缘最近。 当您需要处理多个指向同一多边形的点查询时,后者的效率无与伦比,但是要花很多精力才能实现。因此,这完全取决于您需要哪种解决方案。 附言我看到您在问题中指出要针对单个多边形的大量点运行它。这立即使基于Voronoi-diagram的解决方案成为可能。该算法的额外细微差别可能取决于是否事先完全知道大量点,还是以无法预测的方式逐点到达。     
在SO上发布此帖子,以获取从多边形内的点到多边形边缘的灵感距离,或者该点与线段之间的最短距离     

要回复问题请先登录注册