假设给出了一条线的等式(在2d中),以及形成凸多边形的线的方程(多边形可以是无界的)。如何确定线是否与多边形相交?
此外,是否存在预先定义此类任务的计算几何库?我问,因为我不仅对2D版本感兴趣,而且对n维几何感兴趣。
答案 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)
为零(线与边平行),则符号将由第一个组件确定。否则,第二个组件将主导并确定标志。