【问题标题】:Finding intersection between sets of points describing a curve查找描述曲线的点集之间的交点
【发布时间】:2014-07-15 05:04:17
【问题描述】:
假设我有两组点
p1, p2, p3,... ,pn
和
q1, q2, q3,..., qn
描述平面中的两条路径(曲线)。这些点可能不是从曲线中均匀采样的,但它们是“有序的”(关于曲线的参数化)。找出这两条曲线相交位置的好方法是什么?
例如,我可能每个只有两点
(0,0) (1,0)
和
(-5,1) (-4,-1)
在这种情况下,它们的交点是 (-4.5,0)。
最简单的方法是在每两个点之间绘制边缘,扩展它们,然后查看是否有任何两对边缘在合适的土地上相交。我很好奇是否有更好的方法。
【问题讨论】:
标签:
algorithm
graphics
3d
geometry
computational-geometry
【解决方案1】:
找到这种交点最有效的方法是通过扫描线算法,它可以达到 O(n log n + k) 运行时间(n 线段有 k 个交点),通过详尽比较优于 O(n²) .见http://www.ti.inf.ethz.ch/ew/lehre/CG09/materials/v9.pdf。不幸的是,这样的解决方案相当复杂。
一种可能的替代方案,实现起来更简单,是使用分层边界:获取每个段的边界框,将框两两合并(连续段),然后四乘四,依此类推。从 N 个段开始,您将形成 N-1 个边界框的层次结构。
然后,要使两条曲线相交,检查它们的顶级边界框的干扰。如果确实重叠,则递归检查子框的干扰,依此类推。
除非你的曲线紧密交织,否则你可以省去大量的段比较。
【解决方案2】:
您可以对每条折线(线段链)进行预处理,并为每条线找到一个最小边界矩形。您还可以为每条折线构建一个分层数据结构 - 一个矩形用于整个折线,然后一个矩形用于每一半,依此类推。您可以使用其他几何形式来代替矩形 - 例如圆形或椭圆形。
那么你可以使用Clipping and Culling来加速路口搜索。
【解决方案3】:
您可以围绕一组点计算边界框,例如每 100 对点,并且仅以 n x n 方式与这些点相交。边界框相交可以非常有效地完成。如果两个边界框(每条曲线中的一个)相交,您可以仅测试这些框内涉及的边缘是否相交。
这将处理曲线之间有多个交点的情况。请注意边界情况,当交点实际上是定义边的顶点之一时。