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