Geometry 如何测试直线是否与凸多边形相交?
假设给定了一条直线的方程(在2d中),以及形成凸多边形的直线方程(多边形可以是无界的)。如何确定直线是否与多边形相交 此外,是否存在预定义此类任务的计算几何库?我这样问是因为我不仅对2D版本感兴趣,而且对n维几何感兴趣。在几何中,通常多边形是有界的。 你所描述的通常称为多面体或多面体 有几个可用的几何体库,其中两个是boost(polygon)和CGAL。通常,处理2d、3d和N-d的计算方法之间存在明显的分歧——原因显而易见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的计算方法之间存在明显的分歧——原因显而易见 对于您的问题,我将使用某种二进制空间分区树方法。我会取你的“多边形
对于您的问题,我将使用某种二进制空间分区树方法。我会取你的“多边形”的第一行,然后根据它修剪查询行,创建一条光线。光线将从两条线的交点开始,沿着“多边形”的第一条线生成的半空间的内部方向进行。现在我将用光线和“多边形”的第二行重复这个过程。(这可能会生成一个段而不是射线)如果在某个点上,射线(或现在的段)原点位于当前考虑的多边形线的外侧,并且没有与它相交,则答案是“否”-该线没有与“多边形”相交。否则它就会相交。特别注意各种平行边缘的情况。非常简单,适用于多维情况。对于二维情况,我认为问题简化了一点 该线将空间划分为两个区域 如果多边形仅存在于其中一个区域中,则直线不会与其相交 如果多边形在两个区域中都存在,则直线与多边形相交 因此: 取与直线垂直的任意一条直线,与直线相交 在原点划线 将多面体的每个顶点投影到垂直面上 如果这些投影同时出现在两个符号上,则多边形 与直线相交 [根据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。谢谢-完全正确;我确实有这个想法,但后来忘了把它包括在内。请参见编辑。