【问题标题】:Clipping two 2D triangles剪裁两个二维三角形
【发布时间】:2015-01-04 10:41:32
【问题描述】:

我知道那里有高效的多边形裁剪算法(例如 Maillot、Vatti、Greiner-Hormann)。然而,这些算法适用于任意多边形,虽然它们适合我的情况,但在我看来,将这种通用算法用于像我这样的简单情况有点过头了。

我有两个 2D 三角形(见下图),我想将一个与另一个进行剪辑。除了一般的多边形裁剪算法之外,在网络上搜索没有发现任何东西。

问:是否有专门的算法来裁剪两个二维三角形?

【问题讨论】:

    标签: math graphics geometry computational-geometry polygons


    【解决方案1】:

    对于两个凸形,传统方法只是 Sutherland Cohen,但带有或多或少的标志。

    例如在你的情况下:

    • 蓝色 A 在红色 AB 之外,但在另外两个红色边缘之内;给它代码 100;
    • 蓝B同理;给它代码 100;
    • 蓝色 C 在红色 BC 之外,但在其他两个内部,所以给它代码 010。

    从A开始:

    • 代码非零,输出中不要包含蓝色A;
    • 查看边缘蓝色 AB,二进制与非零,因此不考虑输出;
    • 蓝色 B 的代码非零,不包含在输出中;
    • 将 B 和 C AND 编码为 0,因此对它们进行 XOR*。给出 110。所以找到蓝色 BC 与边缘红色 AB 和 BC 的交点,将它们添加到 outpyt 列表中;
    • 蓝色 C 的代码非零,不包含在输出中;
    • 蓝色 C 和 D 的代码再次指示与 BC 和 AB 相交,这样做并添加到输出中。

    (* 或 OR 它们;我们已经确定它们没有共同点,因此没有区别 — 我认为 XOR 更能说明您正在寻找差异)

    【讨论】:

      【解决方案2】:

      描述了两种对凸多边形有效的方法here - Hoey 算法和 O'Rourke 算法。
      (我使用 O'Rourke 的凸四边形)

      【讨论】:

        【解决方案3】:

        只是优化提示。

        关于哪些边相交以及哪些顶点属于最终轮廓的完整讨论仅取决于由一个三角形的顶点 (A) 和另一个三角形的边 (B) 形成的三角形的代数面积。

        有 9 个这样的三角形,因此有 9 个区域和 9 个标志。无论如何,用(A)的相同顶点构建的三个三角形的面积之和等于(B)的面积,并且只需要完全计算9 - 3 + 1 = 7个面积。

        此外,两条边之间的交点是从两个区域计算的,使用类似 t= S / (S - S') 的公式,其中 t 是沿一条边的参数。

        因此,可以将完全展开的算法编写为深度为 9 的决策树(使用 9 个带符号区域),每个叶子(其中 512 个!)生成一系列顶点/交点。最多可能有 6 个路口。

        【讨论】:

        • 可能有超过 512 个叶子,因为这些决定因素中的每一个都可能是正数、负数、或零...所以最多 3^9 = 19683 个叶子. (当然,使用问题的对称性,大部分可能会被删除)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 2016-02-11
        • 1970-01-01
        • 2018-08-22
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多