如何检查一个段是否与任何一条线相交?

时间:2013-01-19 11:05:19

标签: c++ algorithm search stl intersection

我有std::list行。每行是2个CPoint对象的列表,标记行的起点和终点

std::list<std::list<CPoint>> edges;

然后我有另一行(2个CPoints的列表),我想测试它与主列表的任何行的交集。我怎样才能做到这一点?可能是循环内的交叉测试以进行迭代。

1 个答案:

答案 0 :(得分:2)

如您所建议的那样,基本方法是迭代所有行,然后应用line intersection算法。渐渐地,这可能是最好的;毕竟你的新行可能会与所有其他行相交。

在许多线交叉算法中,我们首先应用边界框测试。非常粗略,确保包含被比较的两条线的矩形重叠。如果它们不重叠,则线条不能相交,但如果它们做了更全面的测试则需要应用。

如果两个框的x间隔重叠并且两个框的y间隔重叠,则边界框测试正在进行。有一些数据结构专门用于有效的区间交叉检查。查看有关interval trees的信息。在许多情况下,这样的结构意味着您将在更少的线路上执行边界框测试;在测试需要应用之前,数据结构会丢弃一些行(通过它们的间隔)。