在极地平面中找到交叉点的算法

时间:2015-09-12 11:40:21

标签: algorithm graph geometry computational-geometry graph-algorithm

我有一个相对于基点的极坐标平面(下图中的绿色)。因此,点和段表示:

class Node {
    int theta;
    double radius;
}

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:2)

如果您想要简单而不是表现,可以执行以下操作:

public void printList() {
    LinkedList head = this;
    StringBuffer sb = new StringBuffer();
    sb.append(head.data); // read data from current element
    while(head.next!=null){               // if there is next element
        head = head.next;                 // visit it
        sb.append(", ").append(head.data);// and read its data
    };
    System.out.println(sb.toString());
}

您可以计算出的交叉乘积很容易适应笛卡尔方程或直接适应极坐标。

enter image description here

此外,我相信你可以调整这个程序,以O(N lg N)运行,N是段的数量,通过极角对点进行排序,并使用扫描线算法遍历段(和点) )list。

答案 1 :(得分:1)

如果每个黑色线段的端点不同,则为uniquely define a line。同样,非简并红线段的端点定义了唯一的线。对于每条可能的红线,计算每条黑线的交点。

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

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

给定每个线段的端点,在two-point form中制作线性方程式。

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

要确定某条线上的点是否属于该线条的某个线段,请取该点的x坐标,并检查它是否位于该线段端点的x坐标之间。