Geometry 如何测试直线是否与凸多边形相交?

Geometry 如何测试直线是否与凸多边形相交?,geometry,2d,polygon,computational-geometry,convex-polygon,Geometry,2d,Polygon,Computational Geometry,Convex Polygon,假设给定了一条直线的方程(在2d中),以及形成凸多边形的直线方程(多边形可以是无界的)。如何确定直线是否与多边形相交 此外,是否存在预定义此类任务的计算几何库?我这样问是因为我不仅对2D版本感兴趣,而且对n维几何感兴趣。在几何中,通常多边形是有界的。 你所描述的通常称为多面体或多面体 有几个可用的几何体库,其中两个是boost(polygon)和CGAL。通常,处理2d、3d和N-d的计算方法之间存在明显的分歧——原因显而易见 对于您的问题,我将使用某种二进制空间分区树方法。我会取你的“多边形

假设给定了一条直线的方程(在2d中),以及形成凸多边形的直线方程(多边形可以是无界的)。如何确定直线是否与多边形相交

此外,是否存在预定义此类任务的计算几何库?我这样问是因为我不仅对2D版本感兴趣,而且对n维几何感兴趣。

在几何中,通常多边形是有界的。 你所描述的通常称为多面体或多面体

有几个可用的几何体库,其中两个是boost(polygon)和CGAL。通常,处理2d、3d和N-d的计算方法之间存在明显的分歧——原因显而易见


对于您的问题,我将使用某种二进制空间分区树方法。我会取你的“多边形”的第一行,然后根据它修剪查询行,创建一条光线。光线将从两条线的交点开始,沿着“多边形”的第一条线生成的半空间的内部方向进行。现在我将用光线和“多边形”的第二行重复这个过程。(这可能会生成一个段而不是射线)如果在某个点上,射线(或现在的段)原点位于当前考虑的多边形线的外侧,并且没有与它相交,则答案是“否”-该线没有与“多边形”相交。否则它就会相交。特别注意各种平行边缘的情况。非常简单,适用于多维情况。

对于二维情况,我认为问题简化了一点

该线将空间划分为两个区域

如果多边形仅存在于其中一个区域中,则直线不会与其相交

如果多边形在两个区域中都存在,则直线与多边形相交

因此:

取与直线垂直的任意一条直线,与直线相交 在原点划线

将多面体的每个顶点投影到垂直面上

如果这些投影同时出现在两个符号上,则多边形 与直线相交

[根据elexhobby的评论进行更新。]

忘了包括无界案件的处理

我想补充的是,可以创建一个“虚拟顶点”来表示开放区域。我们真正需要的是开放区域的“方向”。我们可以将其作为开放区域边界边向量的平均值


然后我们用法线处理该方向的点积,并将其添加到顶点投影集中

我不完全确定,但我想你可以通过使用对偶来解决这个问题。首先将你的行方程归一化为<代码> A.X+BY=1 ,并考虑点集<代码>(a,b)< /c> > /p>
它们必须形成一个凸多边形,我的猜测是新线可能与多边形内的点不对应。通过验证新点是否位于所有边的同一侧,可以轻松检查这一点。(如果不知道直线的顺序,请先构造凸包。)

让我们从有限多边形开始

要与多边形相交,直线必须与其一条边相交。只有当两点位于直线的不同侧面时,直线和边之间才可能相交

可以使用
符号(十字积(Ep Lp,Ld))
轻松检查边缘的两个点
Ep
-边缘点,
Lp
-直线上的某点,
Ld
-直线的方向向量,
cross_乘积(A,B)=Ax*By Ay*Bx

为了处理无限多边形,我们可以引入“无限点”。如果我们有一条半无限边,边上有点
E1
和方向
Ed
,它的“第二点”类似于
E1+infinity*Ed
,其中
infinity
是“足够大的数”

对于“无限点”,检查将略有不同: 交叉产品(Ep Lp、Ld)= =叉积(E1+无穷大*Ed Lp,Ld)= =叉积(E1 Lp+无穷大*Ed,Ld)= =叉积(E1 Lp,Ld)+叉积(无穷大*Ed,Ld)= =叉积(E1 Lp,Ld)+无穷大*叉积(Ed,Ld)


如果
叉积(Ed,Ld)
为零(直线平行于边缘),则符号将由第一个分量确定。否则,第二个组成部分将主导并确定符号。

嗯,不是真的正确吗?左边的图表对所有顶点与法线的点积有相同的符号,但它与多面体相交。@elexhobby。谢谢-完全正确;我确实有这个想法,但后来忘了把它包括在内。请参见编辑。