如何通过坐标给定的点来识别可变大小的区域?

Posted

技术标签:

【中文标题】如何通过坐标给定的点来识别可变大小的区域?【英文标题】:How to identify a variable-sized zone by a point given by coordinate? 【发布时间】:2014-02-07 19:30:06 【问题描述】:

使用经度和纬度将地图划分为大小可变的区域。

为简单起见,让我们将地图视为笛卡尔平面,将经度和纬度视为 x,y 坐标。

区域总是一个矩形。例如,一个区域可以表示为 x∈(0,3],y∈(30,50] 笛卡尔平面的范围是有限的,但非常大。

那么,当给定一个x,y坐标时,我们如何识别该坐标所属的区域呢?

例如,当我们有一个 x,y 坐标 (2, 36) 时,我们如何有效地找到它属于区域 x∈(0,3],y∈(30,50]?

【问题讨论】:

看起来很简单:if (x >= 0 and x < 3 and y >= 30 and y < 50)in_the_zone = true; 看似简单,其实不然。 请详细说明。我提出的方法是否不合适? 您有数以万计的区域,并且您拥有这些区域的 x、y 坐标范围列表。当给定 (x,y) = (2,36),这是用户的位置时,您必须有效地搜索它所属的区域。该位置属于区域 x∈(0,3],y∈(30,50]) 并不明显。一种天真的方法是遍历列表中的每个区域,但这会太慢。如果它是一维的,也许我们可以将区域范围的均值存储在二叉搜索树中并快速查找并比较一些,但它是二维的,这会使问题复杂化 你需要的数据结构叫做R-tree。 【参考方案1】:

正如我在评论中提到的,您可以使用R-tree 解决此问题。链接的 wiki 文章给出的解释比我想象的要好,但基本概念非常简单:

给定一组区域 R0(在您的示例中为矩形),您可以通过对原始区域进行分组并计算它们的边界矩形来构造一组 更少 个区域的 R1

例如,考虑以下区域集(我想保持符号简单,这就是为什么我只考虑对角线上的正方形:(p, s) 我的意思是左下角位于 (p, p) 的正方形和边长为s):

R0 = (0, 1), (1, 1), (3, 1), (4, 1)

我们现在可以对前两个和最后两个区域进行分组并计算它们的边界矩形以到达R1

R1 = (0, 2), (3, 2)

现在的诀窍是,给定查询点(1.5, 1.5),我们不必检查R0 中的所有区域。我们首先对R1进行查询,发现该点位于(0, 2)区域内。因此,我们只需要在该边界矩形的 children 中进行搜索,它们是 R0 中的前两个区域。


当然,这是一个非常简单的例子。在实践中,您希望在R1 的每个边界矩形中只有几个(一些较低的常数,例如 4 个)R0 区域。所以当你有很多输入区域时,R1 中仍然会有很多矩形。幸运的是,我们可以再次应用相同的技巧,并从R1 中创建一组较小的边界矩形R2。以此类推,直到你到达一个集合Rn,它只包含几个矩形。

您因此创建了一棵完整的树:整个区域都是根。 Rn 中的每个矩形都是***子级,以此类推。

查询就像我在简单示例中描述的那样工作:您只需要递归包含查询点的矩形,理想情况下您可以排除许多其他矩形。


那我为什么说理想?让我们回到示例并假设我将第一个和最后一个矩形以及中间的两个矩形分组。这会给我一组不同的边界矩形:

R1 = (0, 5), (1, 3)

这些矩形是重叠的,因此与上面相同的查询点将在两个矩形中。也就是说,我们仍然需要检查R0 的所有区域。

因此,正确划分矩形非常重要。找到最佳划分的问题是 NP-hard,因此您必须使用启发式算法。一个简单的方法是按矩形的左 x 坐标对矩形进行排序并相应地划分它们。在下一个级别中,您将通过 y 坐标执行相同的操作。当所有矩形均匀分布并接近正方形时,该方法效果很好。

【讨论】:

【参考方案2】:

请参阅 Seidel 的论文“用于计算梯形分解和三角剖分多边形的简单快速增量随机算法”,网址为 http://www.cs.princeton.edu/courses/archive/fall05/cos528/handouts/A%20Simple%20and%20fast.pdf。假设您有 n 个矩形,对矩形集进行这样的梯形分解将使 O(log n) 查找包含给定查询点的矩形的时间。

【讨论】:

以上是关于如何通过坐标给定的点来识别可变大小的区域?的主要内容,如果未能解决你的问题,请参考以下文章

通过选择散点图上的点来更新虚线表

编程:判断一个点是否在矩形内部

区域搜索中的点

android 二维码解码的时候会扫描,三个定位点 ,这三个坐标怎么获取?

MFC如何获取控件在对话框上的位置坐标

通过在曲线上移动一个点来更新曲线