【问题标题】:Getting a list of locations within a triangle in the form of x,y positions以 x,y 位置的形式获取三角形内的位置列表
【发布时间】:2012-02-15 22:34:11
【问题描述】:

假设我有一个由三个整数顶点 (x1,y1)、(x2,y2) 和 (x3,y3) 给出的三角形。我可以使用哪种算法来返回位于三角形内的所有(x,y)整数对的完整列表。

【问题讨论】:

  • 这将是无限数量的点,除非您施加某种约束,例如坐标是整数?
  • 请说明。如果@PaulR 是正确的,那么解决方案与我在回答中建议的非常不同。
  • 你强调你想要所有对,但显然有无数对。你的意思是整数对吗?在那种情况下,这就是光栅化的问题,并且有大量关于这个主题的文献。这是一个很好的教程:joshbeam.com/articles/triangle_rasterization 您可能需要根据您所说的“内部”来调整它,因为我不知道您是否要包含边界。
  • 现在问题已经更新以指定生成的 x,y 坐标必须是整数,知道顶点的坐标是否也是整数也可能有用?

标签: algorithm math geometry 2d computational-geometry


【解决方案1】:

下面的算法应该是合适的:

  1. 按 x 坐标升序对三角形顶点进行排序。现在我们在一侧(顶部或底部)有两段(1-2 和 2-3),另一段有一段(1-3)。

  2. 计算线方程的系数(包含线段):

    A * x + B * y + C = 0
    A = y2 - y1
    B = x1 - x2
    C = x2 * y1 - x1 * y2
    

    有 (x1, y1) 和 (x2, y2) 是直线的两个点。

  3. 对于每个范围 [x1, x2)、(x2, x3] 和 x2(特殊情况),迭代范围中的整数点并对每个 x 执行以下操作:

    1. 查找顶部边界为 y_top = (- A1 * x - C1) div B1。
    2. 找到底部边界为 y_bottom = (- A2 * y - C2 - 1) div B2 + 1。
    3. 将 (x, y_bottom) 和 (x, y_top) 之间的所有点添加到结果中。

此算法适用于非严格内部顶点。对于严格内部的顶点,项目 3.1 和 3.2 略有不同。

【讨论】:

    【解决方案2】:

    这个问题的正确名称是三角形rasterization

    这是一个经过充分研究的问题,有多种方法可以解决。两种流行的方法是:

    1. 逐行扫描。

      对于每条扫描线,您都需要一些基本几何图形来重新计算 行的开始和结束。见Bresenham's Line drawing algorithm

    2. 测试边界框中的每个像素,看它是否在 三角形。

      这通常通过使用barycentric 坐标来完成。

    大多数人认为方法 1) 更有效,因为您不会浪费时间测试三角形之外的像素,大约是边界框中所有像素的一半。然而,2) 有一个主要优势——它可以更容易地并行运行,因此对于硬件来说通常是更快的选择。 2) 编码也更简单。

    原文paper 用于准确描述如何使用方法 2) 是由 Juan Pineda 于 1988 年编写的,被称为“A Parallel Algorithm for Polygon Rasterization”。

    对于三角形,它在概念上非常简单(如果您学习重心坐标)。如果将每个像素转换为三角形重心坐标,alpha、beta 和 gamma - 那么简单的测试就是 alpha、beta 和 gamma 必须在 0 和 1 之间。

    【讨论】:

      【解决方案3】:

      我喜欢光线投射,在 this Wikipedia article 中有很好的描述。出于同样的目的在我的项目中使用它。该方法也适用于其他多边形,包括凹面。不确定性能,但它很容易编码,因此您可以自己尝试(我的项目中没有性能问题)

      【讨论】:

        【解决方案4】:

        我想您有一个要测试的配对列表(如果这不是您的问题,请清楚地说明您的问题)。您应该首先将这些对存储到四叉树或 kd-tree 结构中,以便拥有一组足够小的候选者。如果你的分数很少,这可能不值得麻烦(但如果你不这样做,它就不会很好地扩展)。

        您还可以通过测试三角形的边界框来进一步缩小候选范围。

        然后,对于每个候选对(x, y),在系统中求解a, b, c

        a + b + c = 1
        a x1 + b x2 + c x3 = x
        a y2 + b y2 + c y3 = y
        

        (我让你解决这个问题),如果a bc 都是正数,则点在三角形内。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-16
          相关资源
          最近更新 更多