在极平面中查找交点的算法

Algorithm to find intersections in a polar plane

我有一个相对于基点的极平面(下图中的绿色)。点和线段表示如下:

class Node {
    int theta;
    double radius;
}

class Segment {
    //each segment must have node that is northern relative to other
    Node northern;
    Node southern;
}

我想弄清楚从基点到每个线段节点的红线是否与任何其他线段相交。在此示例中,红线确实相交。

我应该应用什么算法方法?计算复杂性不如实现简单重要。

如果每条黑色线段的端点不同,则它们uniquely define a line。同样,非退化的红色线段的端点定义了一条唯一的线。对于每条可能的红线,计算与每条黑线的交点。

如果直线相交的点既落在红色线段上又落在黑色线段上,则线段相交。否则他们不会。

在笛卡尔平面中执行所有这些计算最简单,因此首先将极坐标转换为笛卡尔坐标。

给定每条线段的端点,在two-point form中建立一个线性方程。

要找到两条直线的交点,求解两个线性方程组。

要确定线上的点是否落在该线上的线段内,请获取该点的 x 坐标并检查它是否落在线段端点的 x 坐标之间。

如果您追求简单而不是性能,您可以执行以下操作:

For each Segment S (consisting of points P1 and P2)
  For each Point P not belonging to S, if P.theta between P1.theta and P2.theta
    If (cross-product(P1,P,P2) is convex) Then Return(Intersect)
Return (NoIntersect)

您可以轻松地通过笛卡尔方程或直接在极坐标上计算叉积。

此外,我相信您可以将此过程调整为 O(N lg N) 中的 运行,其中 N 是段数,通过按极角对点进行排序并使用扫描线算法来遍历线段(和点)列表。