假设您已经有一条直线的方程(在二维平面内),以及一个由多条直线组成的凸多边形(多边形可能是无界的)。如何判断这条直线是否与多边形相交呢?
此外,是否有计算几何库可以预定义此类任务?我提问是因为我对n维几何问题也感兴趣。
此外,是否有计算几何库可以预定义此类任务?我提问是因为我对n维几何问题也感兴趣。
让我们从有限多边形开始。
要求交点,线必须与其边之一相交。仅当两个点位于线的不同侧时,线与边之间才可能存在交点。
可以通过对边的两个点执行 sign(cross_product(Ep-Lp,Ld))
进行简单检查。其中Ep
是边上的点,Lp
是线上的某个点,Ld
是线的方向向量,cross_product(A,B)=Ax*By-Ay*Bx
。
为了处理无限多边形,我们可以引入 "无穷远点"。如果我们有一个半无限边,具有点 E1
和方向 Ed
,它的 "第二个点" 可以表示为 E1+infinity*Ed
,其中 infinity
是 "足够大的数字"。
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)
为零(直线与边平行),则符号由第一个分量决定。否则第二个分量将主导并确定符号。
我不完全确定,但我猜你可以通过使用对偶性来解决这个问题。首先将你的线性方程标准化为a.x+b.y=1
,并考虑点集(a,b)
。
这些点必须构成一个凸多边形,我猜新的直线可能不对应多边形内部的一个点。可以通过验证新点是否在所有边的同一侧来轻松检查这一点。(如果你不知道线的顺序,首先构造凸包。)