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

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 多边形(面)对象的光线投射非常慢,与地球的线相交

boost 多边形相交 API 的工作方式与应有的方式相反

如何从 ElasticSearch 中的形状中获取相交点

从相交的线串计算有界多边形

POJ 1410 (线段是否与多边形相交 + 点是否在多边形内)

如何知道一条线是否与C#中的平面相交?