【问题标题】:"ray through vertex" special case when detecting point in polygon检测多边形中的点时的“射线通过顶点”特殊情况
【发布时间】:2012-12-17 07:59:52
【问题描述】:

要检测一个点是否在多边形中,您将一条线从该点投影到无穷远,然后查看它与多边形的多少个顶点相交...很简单。我的问题是,如果光线在其中一个点上与多边形相交,则它被视为与两个线段相交,并被视为在多边形之外。我更改了我的函数,使其仅在光线与多边形的一个点相交时计算其中一个线段,但在某些情况下,一条线也可以与该点相交,同时仍然在外面。以这张图为例:

如果您假设左上角的点是“无穷大”,并将射线投射到其他点中的任何一个,两者都在多边形的一个点处相交,并且即使一个顶点也算作与相同数量的顶点相交一个在里面,一个在外面。

有没有办法弥补这一点,还是我只需要假设那些边缘案例不会弹出?

【问题讨论】:

    标签: geometry gis polygon point


    【解决方案1】:

    如果光线恰好在一个顶点上穿过一侧,则仅当另一个顶点在光线上方时才计算该侧。这将解决您的极端情况。

    比如你发的图片,下方的射线在左上角的顶点处穿过正方形的两侧,但一侧在射线上方,另一侧在下方,所以贡献1,找到目标点在里面。上面的射线在右上角的顶点处穿过两侧,两侧都在射线的下方,因此它们对计数的贡献为 0,并且发现目标点在外面。

    更新

    我记得读过一篇文章,其中描述了一种处理一般情况的技术。如果有兴趣,请阅读我的其他答案。

    【讨论】:

    • 如果光线与左下角相交会怎样?
    • 那么两边都在上面,对计数贡献2,是偶数,所以点会被认为在正方形之外。
    • 啊,我明白你在说什么。我会尝试一下。谢谢!
    • 没问题。顺便说一句,简化计算的一种方法是仅使用水平射线,这将使您的计算更容易,代码更快。
    • 顺便说一句,我记得读过关于处理这类问题的一般技术,arxiv.org/pdf/math/9410209.pdf。我将使用此信息更新我的帖子。
    【解决方案2】:

    虽然我的第一个答案应该可以解决这个简单的问题,但我不得不提到存在处理这些特殊情况的通用技术。

    This article 描述了一种处理此类问题的技术。他们提供的第一个示例恰好是您询问的算法!

    这个想法是应用Automatic differentiation aka Dual numbers 来计算符号扰动。

    顺便说一句,同样的技术也可以用来避免在程序中将 0/0 作为特殊情况处理!

    Here 是我最初从中学到这一点的博客文章,它提供了该技术的一些很好的背景知识,并且作者在博客中写了很多关于自动微分 (AD) 的文章。

    尽管看起来 AD 是一种非常实用的技术,尤其是在对运算符重载有很好支持的语言中(例如:C++、Haskell、Python ...),我已经在“现实生活”中使用过它(C++ 中的工业应用)。

    【讨论】:

      【解决方案3】:

      向另一个方向发送光线。

      如果您尝试n+1 不同的方向(n 是多边形点的数量)其中一个肯定不会通过任何顶点。

      与考虑极端情况相比,这将简化代码。

      最坏的情况是O(n)*CheckComplexity(n),很可能是O(n^2)。如果不可接受,您可以按从点到它们的方向对所有顶点进行排序,然后选择某个区间的中间。这将给O(n*log n)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 2016-12-14
        相关资源
        最近更新 更多