【问题标题】:How to efficiently test whether an arbitrary polygon intersects with a square?如何有效地测试任意多边形是否与正方形相交?
【发布时间】:2015-07-31 21:37:56
【问题描述】:

多边形可能是凸面的,也可能不是凸面的。我们可以假设正方形的边缘与 X 和 Y 轴对齐。

计算交叉点 [多边形交叉点的简单算法]1 是多余的,因为我只需要知道它们是否交叉(是或否)。

【问题讨论】:

  • 看看 Sutherland-Hodgman 多边形裁剪算法——它可能会给你一些想法……如果你最后没有顶点——这意味着整个多边形在裁剪区域之外,在你的情况下是正方形:youtube.com/watch?v=Euuw72Ymu0M
  • 我实际上的意思是说你可以做一个“减少”并将你的问题转换为多边形裁剪问题——我们想要移除裁剪区域之外的多边形部分。因此,在您的情况下,您可以将正方形视为剪切区域,将多边形视为多边形。如果您最终没有顶点 - 您的所有多边形都在剪切区域之外。如果你最终有一组顶点,这意味着多边形的某些部分在剪切区域的内部,所以在你的情况下,这意味着有一个交集
  • intersect 是指正方形的至少一条边与多边形的至少一条边相交吗?如果正方形完全包含多边形(反之亦然)而没有实际的边交叉,你会认为这是一个交叉点吗?
  • 对于令人困惑的定义,我深表歉意。我应该提到,我所说的相交实际上是指重叠。如果在多边形和正方形内都存在任何点,则认为它们相交。

标签: algorithm math geometry polygon intersection


【解决方案1】:

我不确定它是否是最知名的算法(实际上我更确定有更好和知名的算法),但我确信这个解决方案应该有效。

这个想法是将问题“减少”为将多边形裁剪到裁剪区域的问题(即将问题转换为不同的问题,并使用解决新问题的算法来解决)。做这样的减少:

  • 如果您最终将多边形的某些部分留在剪切区域内 - 则存在交叉点
  • 如果您最终有一组空的多边形顶点 - 即您在剪裁区域内什么都没有 - 那么就没有交集

用于多边形剪裁的 Sutherland-Hodgman 算法就是这样做的——如果多边形穿过剪裁区域——它最终会为您提供代表被剪裁多边形的顶点列表。如果多边形完全在剪切区域之外(即没有交叉点) - 那么它最终会为您提供一个空列表,因为实际上没有可以在剪切区域内绘制的多边形部分。

您可以在此处找到有关用于裁剪多边形的 Sutherland-Hodgman 算法的说明:https://www.youtube.com/watch?v=Euuw72Ymu0M

【讨论】:

  • 谢谢。我将把这个问题留待久一点,看看是否还有其他算法。
  • 肯定还有其他算法
【解决方案2】:

您可以只遍历多边形的边缘并检查其中一个是否与您的正方形相交。如果有,那么你就完成了。否则只需测试 1) 正方形的中心是否属于多边形 2) 多边形中的任意点是否属于正方形或 3) 1) 和 2) 都不成立。在情况 1) 和 2) 中它们确实重叠,在情况 3) 中它们不重叠。

【讨论】:

  • 感谢简单有效的算法。我打算将其用作四叉树的子程序。在四叉树的上下文中,是否可以进一步加速算法?
  • 如何在四叉树中准确地表示多边形?
  • 谢谢@vib 会有一些精度损失。我计划使用高度为 h 的四叉树来表示多边形,这样所有与多边形相交的 h 层的瓦片都将被保留,而其他瓦片将被丢弃。也会有一些修剪。例如,如果四叉树中某个内部节点的瓦片完全被多边形覆盖,则无需进一步深入该节点。
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多