快轴对齐细胞遍历算法

时间:2012-12-04 10:18:46

标签: algorithm language-agnostic geometry aabb

  • 给定轴对齐的正方形,划分为四个大小相等的单元格A,B,C和D.
  • 给定从s1点到s2的线段。

找到细分所遍历的细胞(如果有的话)的最快方法是什么,按遍历顺序排序?

sketch of cells

在上面的示例中,正确的结果是:

  • 第1部分:[D]
  • 第2部分:[A,B]
  • 第3部分:[C,D,B]
  • 第4部分:[]
  • 第5部分:[C]

2 个答案:

答案 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。