【发布时间】:2015-11-03 11:45:43
【问题描述】:
我正在研究平面点位置,现在正在考虑使用 The Slabs 方法。
我已经阅读了几篇文章:
我理解持久平衡二叉搜索树背后的概念,但我们在这个问题中忽略它们,我并不关心额外的存储空间开销。文章的内容是他们正在讨论如何提高速度,但不解释基本内容。例如:
如果我错了,请纠正我:
我们在所有交叉点上画一条线。
现在,我们的平板被不同角度的线段分割。
与任何线的每个交点都被视为一个顶点。
Slab 在二叉搜索树中按顺序排序(让我们省略部分持久的 bst)
不知何故,扇区在那些各自的 BST 中排序,即使分割它们的段几乎总是成一个角度。是不是每个节点都要带一个面积的定义?
请参考此示例图片:
问题:
我如何才能真正确定该点是否位于节点 c 而不是节点 b 中?是不是通过区域?
我是否需要安排我的节点以包含有关段的信息?然后我可以检查查询点是否位于段上方(如果这是我应该确定我的扇区的方式)?如果是这样,我会在之后搜索一个多边形列表,看看这个特定段属于哪个多边形吗?
也许我需要为每条线而不是平板存储 BST?
然后我是否必须查看属于左侧线的 2 个 BST,以及从顶点到右侧的第二个线?然后,我可以按每棵树中的 y 坐标对顶点进行排序,并返回查询点正下方的顶点(段的末尾)的 y 坐标。为左右线完成此操作后,我将进行比较以查看这些顶点来自的段的名称是否实际匹配。
但是,这不会给我正确的答案,因为即使名称匹配,我也可能低于或高于该段(如果我接近它)。此外,这意味着我必须进行 3 次二进制搜索(1 次用于线,1 次用于左行的 y 坐标,1 次用于右行),并且书籍说我只需要进行 2 次搜索(1 次用于平板,第二次部门)。
有人可以指点我做这件事的方向吗?
我可能只是错过了一些重要的想法或其他东西。
编辑:
Here 是另一篇好文章,它解释了问题的解决方案,但是,我不太明白如何实现以下目标:
"考虑任意查询点 q ∈ R2。要找到 G 的包含 q 的面,我们首先使用 q 的 x 坐标进行二分查找,找到包含 q 的垂直平板 s。给定 s,我们使用 q 的 y 坐标进行二分搜索来找到 q 所在的 Es 的边。"
如何准确找到这两条边?是否像检查点是否位于线段下方一样简单?然而,这似乎是一项复杂的检查(而且成本很高),因为我们沿着树向下检查其他节点。
【问题讨论】: