Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 快速轴对齐单元遍历算法 给定一个轴对齐的正方形,分成大小相等的四个单元格A、B、C和D 给定从点s1到点s2的线段_Algorithm_Language Agnostic_Geometry_Aabb - Fatal编程技术网

Algorithm 快速轴对齐单元遍历算法 给定一个轴对齐的正方形,分成大小相等的四个单元格A、B、C和D 给定从点s1到点s2的线段

Algorithm 快速轴对齐单元遍历算法 给定一个轴对齐的正方形,分成大小相等的四个单元格A、B、C和D 给定从点s1到点s2的线段,algorithm,language-agnostic,geometry,aabb,Algorithm,Language Agnostic,Geometry,Aabb,查找按遍历顺序排序的段(如果有)遍历的单元格的最快方法是什么 在上面的示例中,正确的结果是: 第1部分:[D] 第2部分:[A、B] 第3部分:[C、D、B] 第4部分:[] 第5部分:[C] 您可以通过Amanatides和Woo进行尝试 它旨在处理大网格,但该原理也适用于您的应用。仅使用简单的直线相交公式即可完成以下操作: 请注意,栅格由6条线段组成(3条水平线段,3条垂直线段)。如果要将这些线段延伸到无穷远(使它们成为直线,没有起点或终点),则已将二维空间划分为16个区域 定义一个4x

查找按遍历顺序排序的段(如果有)遍历的单元格的最快方法是什么

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

  • 第1部分:[D]
  • 第2部分:[A、B]
  • 第3部分:[C、D、B]
  • 第4部分:[]
  • 第5部分:[C]
您可以通过Amanatides和Woo进行尝试


它旨在处理大网格,但该原理也适用于您的应用。

仅使用简单的直线相交公式即可完成以下操作:

请注意,栅格由6条线段组成(3条水平线段,3条垂直线段)。如果要将这些线段延伸到无穷远(使它们成为直线,没有起点或终点),则已将二维空间划分为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。

谢谢你的链接。正如你所指出的,该算法非常适合于大型网格,因为初始化成本相当高,遍历单个单元格的成本很低。因此它并没有真正利用只有四个单元格的事实。我想到了l艾克,但我无法控制自己。