如何测试线是否与凸多边形相交?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何测试线是否与凸多边形相交?相关的知识,希望对你有一定的参考价值。
假设给出了一条线的等式(在2d中),以及形成凸多边形的线的方程(多边形可以是无界的)。如何确定线是否与多边形相交?
此外,是否存在预先定义此类任务的计算几何库?我问,因为我不仅对2D版本感兴趣,而且对n维几何感兴趣。
对于2D情况,我认为问题简化了一点。
该线将空间划分为两个区域。
如果多边形仅存在于其中一个区域中,则该线不与其相交。
如果多边形出现在两个区域中,则该线与它相交。
所以:
取任何垂直线,使线与原点相交。
将多面体的每个顶点投影到垂直线上。
如果这些投影出现在两个符号上,则多边形与线相交。
[更新以下elexhobby的评论。]
忘了包括处理无界案件。
我想添加一个可以创建一个“虚拟顶点”来表示开放区域。我们真正需要的是开放区域的“方向”。我们可以将其作为开放区域边界的矢量平均值。
然后我们用法线处理该方向的点积,并将其添加到顶点投影集合中。
在几何中,通常是see wikipedia,多边形是有界的。你所描述的通常被称为多面体或多面体see wikipedia
有几个几何库可用,我想到的有两个是boost(多边形)和CGAL。通常,由于显而易见的原因,处理2d,3d和N-d的计算方法之间存在明显的分歧。
对于你的问题,我会使用一些二进制空间分区树方法。我会取你的“poly”的第一行并修剪查询线,创建一条光线。光线将从两条线的交点开始,并沿着由“多边形”的第一条线产生的半空间内部的方向前进。现在我将用光线和“poly”的第二行重复这个过程。 (这可能会生成一个段而不是光线)如果在某个点上光线(或现在的线段)原点位于当前考虑的多边形线的外侧并且不与它相交,则答案为否 - 线不相交你的“聚”。否则它会相交。特别注意各种平行边缘情况。相当直接,适用于多维案例。
我不完全确定,但我想你可以通过使用二元性来解决这个问题。首先将线方程标准化为a.x+b.y=1
,并考虑点(a,b)
的集合。
这些必须形成凸多边形,我的猜测是新线可能与多边形内的点不对应。通过验证新点位于所有边的同一侧,可以很容易地检查这一点。 (如果你不知道线的顺序,首先构造凸包。)
让我们从有限多边形开始。
要使多边形相交,一条线必须与其一条边相交。只有当两个点位于线的不同侧时,才可能在线和边之间进行交叉。
可以使用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)
为零(线与边缘平行),则符号将由第一个分量确定。否则,第二个组件将占主导地位并确定标志。
以上是关于如何测试线是否与凸多边形相交?的主要内容,如果未能解决你的问题,请参考以下文章
THREE.js 对单个 > 500k 多边形(面)对象的光线投射非常慢,与地球的线相交