Geometry 三角形与单位正方形相交面积的快速计算

Geometry 三角形与单位正方形相交面积的快速计算,geometry,polygon,intersection,Geometry,Polygon,Intersection,在我当前的项目中,我需要计算无限网格中三角形和单位正方形的相交面积 对于每个三角形(由三对浮点数给出),我需要知道它与每个正方形相交的面积(在区间(0,1]) 现在,我将两者(三角形和正方形)都转换为多边形,并使用它们来计算相交多边形,然后使用它们来计算 这种方法现在已经成为我的应用程序的性能瓶颈算法会快得多。这个问题有标准的解决方案吗,或者你有什么想法吗?我只需要面积,而不是交点的形状。你的多边形是凸的。有一些凸多边形的算法比一般的算法快。我成功地使用了O'Rourke算法(,我相信这是一个

在我当前的项目中,我需要计算无限网格中三角形和单位正方形的相交面积

对于每个三角形(由三对浮点数给出),我需要知道它与每个正方形相交的面积(在区间
(0,1]

现在,我将两者(三角形和正方形)都转换为多边形,并使用它们来计算相交多边形,然后使用它们来计算


这种方法现在已经成为我的应用程序的性能瓶颈算法会快得多。这个问题有标准的解决方案吗,或者你有什么想法吗?我只需要面积,而不是交点的形状。

你的多边形是凸的。有一些凸多边形的算法比一般的算法快。我成功地使用了O'Rourke算法(,我相信这是一个很好的描述)。请注意,有些值可能是为您的平方预先计算的

如果多边形不总是相交,则可以首先使用分离轴方法检查相交的事实

尝试的另一个选项-按正方形剪裁每个三角形边


编辑:您可以使用()算法快速找到三角形边与网格的所有交点。

为了高效地处理此任务,我建议对 瓦蒂线扫描剪辑。

从三角形的最小Y顶点开始执行以下步骤:

  • 按Y坐标对顶点排序
  • 台阶Y向上移动至最小值(下一个Vertex.Y,下一个RidBottom)
  • 计算网格与边的交点
  • 集流梯形
  • 重复步骤2,直到顶点具有最高Y坐标
  • 如果需要,按X坐标拆分梯形
  • 下面是X方向梯形化的示例


    它说明了线扫描算法的主要思想。祝你好运。

    你没有提到你想要的精度。如果你想要的是一种分析方法,请忽略这个答案,但如果你只是想做抗锯齿,我建议你使用Kiia Kallio的。我已经使用过几次,它非常快,可以设置为非常高的精度精度。如果您感兴趣,我有一个java实现。

    您可以利用正方形的规则模式

    我假设这是一个瓶颈的原因是,当你的算法找到与任何三角形相交的所有正方形并计算所有相交面积时,你必须等待。因此,我们将计算所有面积,但分批计算每个三角形,以便从最少的计算中获得最多的信息

    首先,正如其他人所解释的,对于三角形的每条边,您可以找到边通过的正方形序列,以及它与正方形的每条垂直或水平边相交的点

    对所有三个面都这样做,保留一个你遇到的所有方块的列表,但每个方块只保留一个副本。将方块存储在多个列表中可能会很有用,以便给定行上的所有方块都保存在同一个列表中

    当您找到三角形边通过的所有正方形时,如果其中两个正方形在同一行上,则这两个正方形之间不在列表中的任何正方形都完全位于三角形内,因此每个正方形都100%被覆盖

    对于其他正方形,面积的计算取决于三角形在正方形中的顶点数量(0、1、2或3)三角形的边与正方形的边相交的位置。你可以用几张纸笔画出所有的例子,并对每一个例子进行计算。例如,当三角形的边与正方形的两边相交时,正方形的一个角在“外侧”边的一侧,该角是一个小三角形的一个角,被较大三角形的边“切断”;使用正方形边上的交点计算小三角形的面积,并从正方形的面积中扣除。如果两个点而不是一个点是“外侧”,有一个梯形,其两个基本长度是从交点算起的,其高度是正方形的宽度;从正方形中减去其面积。如果三个点在外侧,则减去正方形的整个面积,然后加上小三角形的面积

    大三角形的一个顶点在正方形内,正方形的三个角在该角度外:从剩余的角点到三角形的顶点画一条线,这样你就有两个小三角形,扣除整个正方形并加上这些三角形的面积。正方形的两个角在该角度外,画线到顶点,得到三个小三角形角度等

    我这样做是为了让你总是假设你从正方形的整个面积开始,根据三角形的边与正方形相交的方式减少面积。这样,当三角形的边与正方形相交两次以上时,比如一条边与正方形的一个角相交,另一条边与正方形相交r边穿过一个不同的角,你可以只扣除第一条边所截面积,然后扣除第二条边所截面积

    这将是相当多的特殊情况,尽管您可以利用对称性;例如,您不必四次编写“在一个角上切下一个三角形”的完整计算


    与刚从书架上取下某人的凸面多边形库相比,您将编写更多的代码,并且您将希望测试其中的“活日光”,以确保您不会忘记编写任何案例,但一旦您让它工作起来,就不需要花费太多的努力来使其相当快。

    谢谢。我猜,将两个凸面多边形相交对于我非常简单的形状来说,ons还是有点过分了。但是如果没有的话