您可以利用常规的正方形图案 .
我假设这是一个瓶颈的原因是因为你必须等待你的算法找到所有正方形与任何三角形相交并计算所有交叉区域 . 因此,我们将计算所有区域,但是为了从最少的计算中获取最多信息,每个三角形都会批量计算 .
首先,正如其他人所解释的,对于三角形的每个边,您可以找到边穿过的正方形序列,以及它穿过正方形的每个垂直或水平边的点 .
对所有三个方面执行此操作,保留您遇到的所有方块的列表,但每个方块只保留一个副本 . 将正方形存储在多个列表中可能很有用,这样给定行上的所有正方形都保存在同一列表中 .
当您找到所有正方形时,三角形的边缘通过,如果其中两个正方形位于同一行,则这两个之间的任何不在列表中的正方形都完全在三角形内,因此每个正方形的100%是覆盖 .
对于其他正方形,面积的计算可以取决于三角形在正方形(0,1,2或3)中的顶点数量,以及三角形边缘与正方形边相交的位置 . 您可以在一些铅笔纸图纸中总结所有案例,并为每个案例进行计算 . 例如,当三角形边缘与正方形的两侧交叉时,正方形的一个角落在边缘的“外侧”侧,该角落是一个小角度的一个角,由较大的边缘“切断”三角形;使用正方形边上的交点来计算小三角形的面积,并从正方形区域中扣除它 . 如果两个点而不是一个是“外部”,则有一个梯形,其两个基本长度从交点出发,其高度为正方形的宽度;从广场上扣除它的面积 . 如果三个点在外面,则扣除正方形的整个区域,然后添加小区域三角形 .
正方形内部的大三角形的一个顶点,该角度外的正方形的三个角:从剩余的角线到三角形的顶点绘制一条线,因此您有两个小三角形,扣除整个正方形并添加这些三角形的区域 . 角度外的正方形的两个角,向顶点绘制线以获得三个小三角形等 .
我正在措辞这样你总是假设你从正方形的整个区域开始,并根据三角形的边缘与正方形相交的方式将面积减少一些 . 这样,在三角形的边缘与正方形相交两次以上的情况下 - 例如,一条边切割正方形的一个角,另一条边穿过另一个角,您可以直接扣除被切割的区域 . 第一个边缘,然后扣除第二个边缘切断的区域 .
这将是相当多的特殊情况,尽管你可以利用对称性;例如,您不必编写四次“在一个角落切掉一个三角形”的完整计算 .
你会编写更多的代码,而不是你把一个人的凸多边形库从架子上拿下来,你会想要测试它的生活日光,以确保你不会忘记编码任何情况,但是一旦你让它工作,它不应该花费太多的努力来使它合理快速 .