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

时间:2015-04-16 23:18:09

标签: geometry 2d polygon computational-geometry convex-polygon

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

Intersection vs. no intersection

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

4 个答案:

答案 0 :(得分:1)

对于2D情况,我认为这个问题有点简化。

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

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

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

所以:

  

垂直于线,与线相交   划出原点。

     

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

     

如果这些投影同时出现两个符号,那么多边形   与该线相交。

[更新以下elexhobby的评论。]

忘记包括处理无界案件。

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

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

答案 1 :(得分:0)

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

有几个可用的几何库,我想到的有两个是boost(多边形)和CGAL。一般来说,处理2d,3d和N-d的计算方法之间有明显的区别 - 原因很明显。

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

答案 2 :(得分:0)

我不完全确定,但我想你可以通过使用二元性来解决这个问题。首先将线方程标准化为a.x+b.y=1,并考虑点集(a,b)

这些必须形成一个凸多边形,我的猜测是新线可能与多边形内的一个点不对应。通过验证新点位于所有边的同一侧,可以很容易地检查这一点。 (如果你不知道线的顺序,首先要构造凸包。)

答案 3 :(得分:0)

让我们从有限多边形开始。

要与多边形相交,一条线必须与其一条边相交。只有当两个点位于线的不同侧时,才能实现线与边之间的交叉。

可以使用sign(cross_product(Ep-Lp,Ld))轻松检查边缘的两个点。 Ep - 边缘点,Lp - 线上的某个点,Ld - 线的方向矢量cross_product(A,B)=Ax*By-Ay*Bx

为了处理无限多边形,我们可能会引入“无限点”。如果我们有点E1和方向Ed的半无限边,则其“第二点”类似于E1+infinity*Ed,其中infinity是“足够大的数字”。< / p>

对于“无限分”,检查会略有不同: cross_product(Ep-Lp,Ld)= =cross_product(E1+infinity*Ed-Lp,Ld)= =cross_product(E1-Lp+infinity*Ed,Ld)= =cross_product(E1-Lp,Ld)+cross_product(infinity*Ed,Ld)= =cross_product(E1-Lp,Ld)+infinity*cross_product(Ed,Ld)

如果cross_product(Ed,Ld)为零(线与边平行),则符号将由第一个组件确定。否则,第二个组件将主导并确定标志。