正确的点位置算法数据结构

时间:2016-07-18 14:52:30

标签: python algorithm computer-science computational-geometry planar-graph

我正在处理编程挑战,因为我需要找到给定点所属的区域。这个问题有一些方法。

Point Location

所以我决定使用slab分解,它足够快,更容易实现,并且空间对我来说不是什么大问题。但是,我在哪里开始遇到麻烦。以下是UC Santa Barbara制作的pdf文件中的slab分解示例。

Slab decomposition

我将几何形状存储在节点字典中,如无向图(使用坐标)。

defaultdict(<type 'list'>, {(4.0, 5.0): [(1.0, 2.0), (2.0, 3.0), (3.0, 5.0)],
 (1.0, 2.0): [(2.0, 3.0), (2.0, 4.0), (3.0, 5.0), (4.0, 5.0)],
 (2.0, 3.0): [(1.0, 2.0), (2.0, 4.0), (4.0, 5.0)],
 (2.0, 4.0): [(1.0, 2.0), (2.0, 3.0), (3.0, 5.0)],
 (3.0, 5.0): [(1.0, 2.0), (2.0, 4.0), (4.0, 5.0)]})
像这样。 (仍然不知道 edge 列表会更好吗?)

现在我知道如何解决问题,但是难以决定实现哪种方式,因为输入将是一个非常复杂的几何形状,并且在cpu资源中找到这一点将是昂贵的。

我决定将每个点(使用x坐标排序)存储在排序列表中(使用bisect)。获得平板。但是,我找不到一种方法来找到平板与区域边缘的交叉方式,或者如何分割平板,如图所示。实际上我找到了一种方法,但对我来说感觉不太可行。我可以检查从板的左边开始并在其右边结束的边缘。这意味着边缘正在穿过厚板。这很好,但要实现这一点,每次给出一个新节点并且区域增加时,我将不得不检查几乎一半的顶点。所以这种方法听起来像是对我的失败。知道板中的区域属于哪个区域也存在问题。鉴于我们正在做所有这些以避免逐个检查所有区域以提高速度。

如果你能就这个问题给我一些想法,我不需要任何代码。我只需要有经验的用户提供建议。我被困了,因为我无法确定如何实现它,我不想以错误的方式启动它并重写它。 (我可以向你保证这不是作业。)

注1:我无法确定数据结构,我应该为区域制作结构吗?还是点数?还是边缘?或者我是否需要一个用于创建搜索树的结构?我需要在这个结构中存储什么?

注2:我知道如何找到这个点所在的板块。我也知道如何在平板内找到二分搜索点。我缺乏更多的知识,因此缺乏经验。就像首先代表地区一样。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我建议你也只使用你的顶点来引用。使用边列表表示图形,并为每条边分配左右事件区域。现在在平板分解中使用这些边。一旦找到你的板坯和板坯零件,你就会知道它的区域是靠近点的两个边缘参考它。

答案 1 :(得分:0)

如果您知道您的数据将多次用于定位多个点,那么预处理原始平面图并将其分解为平板是有意义的。然后,您面临的数据结构问题将减少为平板表示问题。

什么是平板?它实际上是一维边缘序列。因此,您将原始问题减少为两个二进制搜索 - 第一个在slabs数组中,第二个在edge数组中。边缘数组中的二进制搜索应该稍微修改一下 - 你需要找到边缘的,从顶部和底部边界测试点(I&#39;我在这里指的是你的照片。尽可能接近。

当然,您需要在边缘数组中的某处存储对原始面部标签的引用。