Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 对于不规则多边形中的点,选择最靠近该点的边的最有效方法是什么?_Geometry_Computational Geometry - Fatal编程技术网

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

Geometry 对于不规则多边形中的点,选择最靠近该点的边的最有效方法是什么?,geometry,computational-geometry,Geometry,Computational Geometry,给定一个不规则多边形和该多边形内的一个点,如何确定多边形中最靠近该点的边 我可能需要对多边形内的一大组点(例如50-200点)进行此计算。请阅读此文章,以获得灵感或此文章 计算直线上与多边形每条边相切的最近点 计算每个线段(多边形的边)上距离所讨论的点最近的点 计算每个线段上最近点到相关点的距离 找到最小距离。对应的具有最小距离的多边形边就是答案 该算法的每一步都是线性时间(O(n)) 以下是每个步骤的基本公式: 计算直线上与多边形每条边相切的最近点。 设多边形边的一个端点为p1={x1,y

给定一个不规则多边形和该多边形内的一个点,如何确定多边形中最靠近该点的边


我可能需要对多边形内的一大组点(例如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)
    • 就像我们之前说的pu={xu,yu}
    • 对每个多边形边重复这些计算(即替换为新的p1s和p2s)
    计算每个线段(多边形的边)上与所讨论的点最近的点。


    0正确答案取决于问题的整体结构时,点
    pu
    仅是线段上最近的点:当考虑多个查询时会发生什么?我假设每个查询将处理不同的点。但是多边形呢?您是否希望收到同一多边形的多个查询?还是每次多边形都不一样

    如果每个查询都应用于不同的、不可预测的多边形,那么唯一的解决方案就是对所有多边形边进行全面检查,并对每个边进行点到段距离测试。它可以通过各种[启发式]方式进行优化(尽早放弃不必要的测试),但在最坏的情况下,没有办法绕过完整的测试

    但是,如果您希望问题的多边形方面具有某种可预测性和稳定性(对同一个多边形或固定的一组多边形进行足够多的点查询),则情况会发生显著变化。在这种情况下,最好的方法是在多边形内部预构建基于边的Voronoi图。然后,您可以解决点定位问题(有已知的有效算法),以确定查询点属于哪个Voronoi区域。这将立即告诉您哪条边是最近的

    当您需要处理对同一个多边形的多个点查询时,后者的效率要高得多,但需要付出相当大的努力才能实现。所以,这完全取决于你需要什么样的解决方案


    另外,我看到你在问题中说,你将对单个多边形的一大组点运行它。这立即使基于Voronoi图的解决方案成为可能。算法的额外细微差别可能取决于这一大组点是完全提前知道的,还是以不可预测的方式逐点到达的。

    因为仅在100个点的数量级上,这不是一个大的点集,除非你做了无数次,或者除非多边形本身有无数条边。在某些情况下,四叉树分解可能会有所帮助。在你到达这一点之前,很容易计算出点到线段的距离,即使是矢量形式,如果你的语言允许这样的计算。我认为
    #中有输入错误,否则如果u>0,那么pc=p2
    。。。应该是u>1吗?谢谢!我非常喜欢这个答案,但有一件事我注意到了。在
    u
    公式中有一个“输入错误”。(x3-x1)(x2-x1)+(y3-y1)(y2-y1)的结果必须除以(x2-x1)^2+(y2-y1)^2,因此需要进行适当的分组。我已经在做这个了。为什么没有支持不规则边界多边形的C#轻量级Voronoi库?我想写我自己的图书馆,但到目前为止,我发现的唯一信息是数学符号和结构,我不熟悉。因此,我想出了一种快速简便的方法(也许不是最有效的)来计算Voronoi图,那就是首先执行Delaunay三角剖分,并使用Voronoi顶点的质心,然后,对于未平分的Delaunay边,在边界多边形的边上运行一条新的平分线。(字符用完了…)。。。在外部质心和每个质心的最近边界多边形边之间运行线将为我提供Voronoi图所需的所有外部多边形。如果我有一个干净、高效、轻量级的支持不规则多边形的Voronoi库,我甚至不需要问这个问题。