给定一个轴对齐的正方形,将其分为四个相等大小的单元格A、B、C和D。 给定一条从点s1到点s2的线段。 最快的方法是什么,可以找到线段所经过的单元格(如果有的话),并按遍历顺序排序? 在上面的示例中,正确的结果如下: 线段1:[D] 线段2:[A,B] 线段3:[C,D,B] 线段4:[] 线段5:[C]
以下内容仅需使用简单的线段相交公式即可完成:观察网格,它由6个线段组成(3条水平线段,3条垂直线段)。如果将每个线段无限延伸(变成没有起点或终点的线),则将2D空间分为16个区域。定义一个4x4的区域数组。对于每个区域,存储哪条线(如果有的话)在其北侧、东侧等方向上界定它。这将是我们的遍历数据结构。现在,要找到给定查询线段S穿过的单元格,从u开始到v结束,我们将使用此遍历数据结构进行线路行走,以跟踪我们当前所在的区域以及我们正在退出该区域的位置。1. 确定Au为u所在的区域,Av为v所在的区域。由于区域的轴对齐性质,每个区域最多只需要4次比较(2次x坐标,2次y坐标)。同时,将当前位置p和当前区域A定义为起始点u和Au。2. 首先,报告A作为S所穿过的区域。确定线段*(p,v]与A的4个边界的界定线之间的第一个交点q。如果找到这样的交点q,则包含q的边界将决定哪个相邻区域将成为我们的新A - 在这种情况下,我们的新p将是交点q。使用这个新的A和p,重复这个步骤。如果没有找到交点,则p必须位于与v相同的区域中,行走结束。*(p,v]表示:从p到v的线段,不包括p但包括v。