我正在研究平面点定位,并考虑使用The Slabs方法。
我已经阅读了几篇文章:
我理解持久平衡二叉搜索树的概念,但在这个问题中让我们忽略它们,我不在意额外的存储空间开销。这些文章讨论如何提高速度,但没有解释基础知识。例如:
如果我错了,请纠正我:
- 我们在所有交叉点处画一条直线。
- 现在,我们有被不同角度的段分割的楼板。
- 任何线与任何线的交点都被视为顶点。
- 楼板按顺序在二叉搜索树中排序(让我们忽略部分持久bst)
- 一些区域在这些相应的 BST中排序,即使将它们分割的段几乎总是呈角度。每个节点是否必须携带一个区域的定义?
请参考此示例图像:
问题:
如何确定点不在节点b而在节点c中?这是否通过计算面积来实现?
是否需要对我的节点进行排列,以包含关于线段的信息?然后,我可以检查查询点是否位于线段上方(如果这是我应该确定扇区的方法的话)?如果是的话,那么我是否需要在多边形列表中搜索,以查看该特定线段属于哪个多边形?
也许我需要为每条线存储二叉搜索树而不是平面图?
那么我是否需要查看左侧线的2个BST和顶点右侧线的第2个BST?我可以在每棵树中按y坐标排序顶点并返回查询点下面的顶点(线段的末端)的y坐标。在为左线和右线完成此操作后,我将进行比较,以查看这些顶点来自的线段名称是否匹配。
但是,这将不会给出正确答案,因为即使名称相同,我可能在线段下方或上方(如果我靠近它)。此外,这意味着我必须进行3次二分查找(1次用于线路,1次用于左线的y坐标,1次用于右线),但书中说我只需要做2次查找(1次用于平面图,第二次用于扇区)。
有人能指点一下该怎么做吗?
我可能只是错过了某些关键的思想或东西。
编辑:
这里 是另一篇好的文章,它解释了该问题的解决方案,但我不太理解如何实现以下内容:
"考虑任意查询点q∈R2。为找到包含q的G面,我们首先使用x坐标的二分搜索来找到包含q的垂直平面s。给定s,我们使用y坐标的二分搜索来找到q所在的Es边缘。"
如何精确地找到这两个边缘?是否仅需检查点是否处于线段下方?然而,随着我们向下遍历树,这似乎是一个复杂并且昂贵的检查。