使用平面分割技术实现点定位计划

3

我正在研究平面点定位,并考虑使用The Slabs方法。

我已经阅读了几篇文章:

我理解持久平衡二叉搜索树的概念,但在这个问题中让我们忽略它们,我不在意额外的存储空间开销。这些文章讨论如何提高速度,但没有解释基础知识。例如:

如果我错了,请纠正我:

  1. 我们在所有交叉点处画一条直线。
  2. 现在,我们有被不同角度的段分割的楼板。
  3. 任何线与任何线的交点都被视为顶点。
  4. 楼板按顺序在二叉搜索树中排序(让我们忽略部分持久bst)
  5. 一些区域在这些相应的 BST中排序,即使将它们分割的段几乎总是呈角度。每个节点是否必须携带一个区域的定义?

请参考此示例图像:

问题:

  1. 如何确定点不在节点b而在节点c中?这是否通过计算面积来实现?

  2. 是否需要对我的节点进行排列,以包含关于线段的信息?然后,我可以检查查询点是否位于线段上方(如果这是我应该确定扇区的方法的话)?如果是的话,那么我是否需要在多边形列表中搜索,以查看该特定线段属于哪个多边形?

  3. 也许我需要为每条线存储二叉搜索树而不是平面图?

  4. 那么我是否需要查看左侧线的2个BST和顶点右侧线的第2个BST?我可以在每棵树中按y坐标排序顶点并返回查询点下面的顶点(线段的末端)的y坐标。在为左线和右线完成此操作后,我将进行比较,以查看这些顶点来自的线段名称是否匹配。

  5. 但是,这将不会给出正确答案,因为即使名称相同,我可能在线段下方或上方(如果我靠近它)。此外,这意味着我必须进行3次二分查找(1次用于线路,1次用于左线的y坐标,1次用于右线),但书中说我只需要做2次查找(1次用于平面图,第二次用于扇区)。

有人能指点一下该怎么做吗?

我可能只是错过了某些关键的思想或东西。

编辑:

这里 是另一篇好的文章,它解释了该问题的解决方案,但我不太理解如何实现以下内容:

"考虑任意查询点q∈R2。为找到包含q的G面,我们首先使用x坐标的二分搜索来找到包含q的垂直平面s。给定s,我们使用y坐标的二分搜索来找到q所在的Es边缘。"

如何精确地找到这两个边缘?是否仅需检查点是否处于线段下方?然而,随着我们向下遍历树,这似乎是一个复杂并且昂贵的检查。

1个回答

3

嗯,这个问题是一年前提出来的,所以我猜你可能已经不在了,无论如何这是一个有趣的问题...

  • 是的,你可以通过每个交点的垂直线将平面划分成板。重要的结果是,触及板的所有线段将全部穿过,并且这些线段的顺序在整个板上是相同的。

  • 在每个板中,您可以按其在板中的顺序创建这些线段的二叉搜索树。您称之为“节点”的区域是树的叶子节点,而线段是内部节点。为了避免歧义,将叶子命名为“区域”。由于线段的顺序在整个板上是相同的,因此该树中的顺序对于板中的每个x坐标都是有效的。

  • 为了确定包含任何点的区域,您需要找到包含该点的板,然后在BST中进行简单搜索以找到该区域。

  • 假设你正在寻找C点,你位于包含(x2,y2) -(x3,y4)的第2个板中。确定C是否在该线段上方或下方,然后进入树中相应的分支。

例如,如果C是(cx,cy),则x = cx处线段的y坐标是:

testy = ((cx-x2) / (x3-x2)) * (y4-y2) + y2

如果cy < testy,则选择向上分支,否则选择向下分支。(假设正Y向下)。

当您到达叶子时,那就是包含C的区域。 完成了。

现在...为每个板制作全新的树需要很多空间,因为您可以有N^2个交点,因此可以有N^2个板。 在每个板中存储一个单独的树将占用O(N ^ 3)的空间。

然而,使用持久性红黑树,板可以实际共享许多节点。 使用像Chris Okasaki的纯函数实现的红黑树,每个交点占用O(log N)的空间,总共占用O(N ^ 2*log N)的空间。

我似乎记得还有一种常数空间的可持续红黑树,可以给你O(N ^ 2),但我没有参考资料。

请注意,在大多数实际情况下,存在接近O(N)的交点,因为线条不会太多地相交,但仍然可以通过使用持久树来节省空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接