说我有两套积分
p1, p2, p3,... ,pn
和
q1, q2, q3,..., qn
描述平面中的两条路径(曲线)。这些点可能无法从曲线中均匀采样,但它们是“按顺序”(关于曲线的参数化)。找出这两条曲线相交的好方法是什么?
例如,我可能只有两点
(0,0) (1,0)
和
(-5,1) (-4,-1)
在这种情况下,它们的交点是(-4.5,0)。
最基本的方法是在每两个点之间绘制边缘,延伸它们,看看是否有任何两对边缘在一片合适的土地上相交。我很好奇是否有更好的方法。
答案 0 :(得分:0)
您可以预处理每个折线(段链),并为每个折线找到最小的边界矩形。您还可以为每条折线构建一个分层数据结构 - 整个矩形的矩形,然后每半个矩形,依此类推。例如,您可以使用其他几何形状而不是矩形 - 圆形或椭圆形。
然后您可以使用Clipping and Culling来加速交叉点搜索。
答案 1 :(得分:0)
您可以计算一组点周围的边界框,例如每100对点,并且只以n×n方式相交。边界框交叉点可以非常有效地完成。如果两个边界框(每条曲线中的一个)相交,则可以测试这些框内所涉及的边的交点。
这将处理曲线之间有多个交叉点的情况。只要注意边界情况,当交点实际上是定义边的顶点之一时。
答案 2 :(得分:0)
找到这种交叉点的最有效方法是通过扫描线算法,可以实现O(n log n + k)运行时间(n个具有k个交叉点的线段),通过穷举比较优于O(n²) 。见http://www.ti.inf.ethz.ch/ew/lehre/CG09/materials/v9.pdf。不幸的是,这样的解决方案相当复杂。
一种可能更简单的实现方法是使用层次结构边界:取每个段的边界框,将两个框合并两个(连续的段),然后四个合并四个,依此类推。从N个段开始,您将形成N-1个边界框的层次结构。
然后,要交叉两条曲线,请检查其顶层边界框的干涉。如果重叠,请检查子框的干扰,等等递归。
除非您的曲线紧密交织在一起,否则您可以节省大量的分段比较。