如何测试圆形和凹面多边形是否相交?


19

我有一个多边形(有时是凸的,但通常是凹的),以及一堆半径不同的圆。如何确定圆是否与多边形相交/重叠?

我可以将我的凹多边形分解成凸块。有帮助吗?

Answers:


26

此问题有两种情况。第一个是交叉点,第二个是交叠(包含)。

第一个(圆内的交点/多边形):

在多边形的每个边缘上找到最接近圆心的点。如果最接近中心的点之间的距离小于半径,则说明您有相交或重叠。

第二个(圆在多边形中是完整的): 从圆心向右(或向左/向上/向下)拍摄光线,并计算光线/段(多边形边缘)的交点。如果相交计数为偶数,则圆在多边形之外。如果是奇数圈,则在里面。

在这种情况下,我将分享演讲者的话:

在此处输入图片说明

并注意特殊情况。

希望这会有所帮助。


编辑:我认为这是公平的向图片添加学分。作者是Petr Felkel,布拉格捷克技术大学的助理教授


我认为仅靠向右“放射”射线是行不通的。也许我误解了您的方法,但据我所知,
bummzack 2011年

2
是的,但是在第一种情况中对此进行了描述。射线只能解决包含多边形的圆(在我的描述中为第二种情况)。您必须测试两种情况。它快速,易于实现且不需要任何内存。
Notabene 2011年

1
对不起,我将“ edge”与“ vertex”混淆了,因此误解了您的第一张支票。正确阅读后,它会起作用:)
bummzack 2011年

7

如您所料,第一步是将凹面多边形拆分为多个凸面多边形。原因是您将使用仅适用于凸多边形的分隔轴定理

SAT本身仅适用于两个凸多边形。名称中的“分隔轴”是指垂直于多边形边缘的轴。不幸的是,圈子有无数个。但是,事实证明,有一种非常简单的方法,通过查看哪些轴向外突出以与多边形的顶点相交,可以找出哪些轴是相关的。

Metanet软件公司(N / N +的制造商)没有讨论整个算法,而是提供了有关使用SAT进行碰撞检测良好教程,该教程第三部分介绍了当一个对象是一个圆时的SAT


您是否有将凹面多边形划分为凸面多边形的参考?您提供的SAT链接未提及任何内容。
ehsanul 2011年

这实际上是一个非常复杂的问题,具体取决于多边形的几何形状,但是所有3D引擎都可以这样做,因为硬件通常只能渲染共面​​的四边形和三角形,而不能渲染多边形。
SplinterReality

1
@ehsanul:en.wikipedia.org/wiki/Polygon_triangulation描述了几种流行的方法。

0

这是我的工作。

  1. 使用水平线测试来检测圆心是否在多边形内。如果是,则它们相交。
  2. 如果不是,请检查以下情况。对于多边形的每一面
    1. 找出多边形边的坡度
    2. 计算垂直斜率
    3. (请仔细阅读)找到多边形边的坡度与构成边的任意一个顶点相交的直线和与圆心相交的边的垂线垂直的相交。
    4. 如果已建立的相交点位于圆内,则意味着您的圆在某个点处与所讨论的边相交,因此与多边形相交
  3. 最后,如果没有其他结论,请检查多边形的任何顶点是否位于圆内(由于以前的测试,您只需要检查一次)即可。如果是,则它们相交。如果没有,您可以说到底不是。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.