【问题标题】: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 方式与这些点相交。边界框相交可以非常有效地完成。如果两个边界框(每条曲线中的一个)相交,您可以仅测试这些框内涉及的边缘是否相交。

      这将处理曲线之间有多个交点的情况。请注意边界情况,当交点实际上是定义边的顶点之一时。

      【讨论】:

        猜你喜欢
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多