我有一个相对于基点的极坐标平面(下图中的绿色)。因此,点和段表示:
class Node {
int theta;
double radius;
}
class Segment {
//each segment must have node that is northern relative to other
Node northern;
Node southern;
}
我想弄清楚从基点到每个段节点的红线是否与任何其他段相交。在此示例中,红线确实相交。
我应该采用什么算法方法?计算复杂性不如简单实施重要。
答案 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());
}
您可以计算出的交叉乘积很容易适应笛卡尔方程或直接适应极坐标。
此外,我相信你可以调整这个程序,以O(N lg N)运行,N是段的数量,通过极角对点进行排序,并使用扫描线算法遍历段(和点) )list。
答案 1 :(得分:1)
如果每个黑色线段的端点不同,则为uniquely define a line。同样,非简并红线段的端点定义了唯一的线。对于每条可能的红线,计算每条黑线的交点。
如果线相交的点落在红色线段和黑色线段上,则线段相交。否则他们不会。
在笛卡尔平面上执行所有这些计算是最简单的,所以首先将极坐标转换为笛卡尔坐标。
给定每个线段的端点,在two-point form中制作线性方程式。
要找到两条线的交点,求解两个线性方程组。
要确定某条线上的点是否属于该线条的某个线段,请取该点的x
坐标,并检查它是否位于该线段端点的x
坐标之间。