找到细分所遍历的细胞(如果有的话)的最快方法是什么,按遍历顺序排序?
在上面的示例中,正确的结果是:
答案 0 :(得分:5)
您可以尝试Amanatides和Woo的"A Fast Voxel Traversal Algorithm for Ray Tracing"。
它旨在处理大网格,但该原则对您的应用程序也很有用。
答案 1 :(得分:3)
以下只能使用简单的线交叉公式来完成:
观察您的网格由6个线段组成(3个水平线,3个垂直线)。如果要将这些段中的每一段扩展为无穷大(使它们成为直线,没有起点或终点),则将2D空间划分为16个区域。
定义4x4区域阵列。对于每个这样的区域,存储哪条线(如果有的话)在北侧,东侧等界定它。这将是我们的遍历数据结构。
现在,为了找到给定查询段S遍历的单元格,从u开始并以v结束,我们将使用此遍历数据结构从u到v进行行走,以跟踪我们当前的区域在我们退出该地区的地点和地点。
将Au确定为u所在的区域,将Av确定为v所在的区域。由于区域的轴对齐特性,每个区域不应超过4次比较(x坐标为2,y为2)。 另外,将当前位置定义为p,将当前区域定义为A;最初,这些将分别是u和Au。
首先,将A报告为S遍历的区域。确定段*(p,v)与A的4个边的每个边界线之间的第一个交点。如果是这样的交点找到点q,包含q的边确定哪个相邻区域将成为我们的新A - 在这种情况下,我们的新p将是交点q。使用这个新的A和p,重复此步骤。
如果没有找到交叉点,则p必须与v位于同一区域,并且步行完成。
* (p,v)含义:p和v之间的段,不包括p但包括v。