如何解决对于不规则多边形中的点,选择最接近该点的边的最有效方法是什么?
| 给定一个不规则多边形和该多边形内的一个点,如何确定多边形中哪个边最接近该点? 我可能必须对多边形中的大量点(例如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上发布此帖子,以获取从多边形内的点到多边形边缘的灵感距离,或者该点与线段之间的最短距离
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。