Algorithm 查找包含点–;高效算法

Algorithm 查找包含点–;高效算法,algorithm,computational-geometry,Algorithm,Computational Geometry,下午好 我的处境: 在二维空间中 输入:一组矩形(也有重叠矩形)。 矩形坐标是整数类型 对矩形大小和矩形位置没有任何限制(仅限整数的范围) 没有宽度为0或高度为0的矩形 我需要找到:包含输入点(带整数坐标)的所有矩形 问题: 保持矩形的有效结构是什么 在这种情况下,什么算法是有效的? 什么算法只对添加矩形有效而不删除矩形 谢谢:-)。在java中,您可以使用shape.contains 但一般来说,假设矩形是由(x,y,宽度,高度)定义的 如果(pt.x>=x&&pt.x=y&

下午好

我的处境:

  • 在二维空间中
  • 输入:一组矩形(也有重叠矩形)。
    • 矩形坐标是整数类型
    • 对矩形大小和矩形位置没有任何限制(仅限整数的范围)
    • 没有宽度为0或高度为0的矩形
  • 我需要找到:包含输入点(带整数坐标)的所有矩形

问题:

  • 保持矩形的有效结构是什么
  • 在这种情况下,什么算法是有效的?
    • 什么算法只对添加矩形有效而不删除矩形

谢谢:-)。

在java中,您可以使用shape.contains

但一般来说,假设矩形是由(x,y,宽度,高度)定义的

如果(pt.x>=x&&pt.x=y&&pt.y矩形
(左、上、右、下)
包含一个点
(x、y)
如果
(假设坐标向下增加,这是我见过的大多数硬件的情况;如果坐标向上增加,更传统的数学情况是,交换
top
bottom
)。你不会得到比测试更高的效率


如果将矩形视为“包含”如果点也位于边界上,则替换所有的

R-Tree是适合此用例的最佳数据结构。R-Tree是用于空间访问方法的树数据结构,即用于索引多维信息,如地理坐标、矩形或多边形。所有矩形的信息角度可以存储在树的形式,所以搜索将很容易

第页,然后将帮助您理解该概念


似乎您的矩形集可能是动态的(“用于添加矩形…”)。在这种情况下,-2D可能是解决方案。

这里是一个简单的解决方案

  • 在平面上定义栅格
  • 每个单元格维护两个列表:完全覆盖此单元格的矩形和部分覆盖此单元格的矩形
  • 每次插入时,将目标矩形的ID放入所有相关的单元格列表中
  • 在每个查询中,找到包含目标点的单元格,输出完全覆盖列表并对部分覆盖列表进行扫描

  • 点的位置、矩形的大小或位置是否有任何限制?点是否可以位于任何(浮点)位置,或仅位于固定网格上?矩形是否具有最小和最大大小?谢谢,我将编辑问题。还相关-谢谢:-)我在C++中写的。我想有几千个矩形,我不想单独检查。也许是一些排序结构。实际上,使用这个算法对成千上万个矩形来说,不应该是当今计算机上的一个处理问题。这个数学公式会执行得很快。尝试排序有点问题-你会如何排序你的RCT?角度?我在考虑一些二叉树-按左角x坐标排序。然后我只检查输入点x坐标左侧的矩形。使用平衡树,我可以节省大约一半的检查时间。对吗?我正在寻找有效的解决方案…是的,应该可以。节省的处理时间将取决于但假设随机点大约有一半是对的,谢谢:-)。我想有上千个矩形,我不想单独检查每个矩形。我正在寻找一些排序结构,以便只获取可能的候选项。不知道是否会找到任何候选项,而无需预先计算包含预期测试点的列表。在这一点上,除非你多次测试相同的几点,否则你不会真正保存任何东西。任何突然出现在脑海中的算法都会在巨大的矩形上出现假负片。。。我在考虑一些二叉树——按左角x坐标排序。然后我只检查输入点x坐标左侧的矩形。使用平衡树,我可以节省大约一半的检查时间。是吗?如果你的矩形分布均匀,可能。但是当然,如果你要检查右边/附近的一个点,你仍然需要检查所有东西。另外,您还需要支付遍历和/或搜索树的费用。非常感谢:-),我会试试。@Nanik您试过了吗?如果你面临任何问题,让我知道。我在几年前就把它编好了,可以帮助你。@TejasP我一直在努力。谢谢你的提议:-)。我想知道一个片段树。在这种情况下,有什么理由R树比段树更好吗?来自wikipedia页面:“即使数据可以放入内存(或缓存),在大多数实际应用程序中,当对象数超过几百个左右时,R-树通常会提供比对所有对象进行简单检查更高的性能优势。但是,对于内存中的应用程序,也有类似的替代方案,可以提供稍好的性能或更易于在实践中实现。”听起来R-tree对于内存中的数据集或更小的数据集来说可能有点过头了。你知道在这种情况下哪些算法(暴力除外)可能更好吗?谢谢你的回答:-)。一旦网格组装好,就可以进行快速搜索。但是,根据网格的分辨率,向网格中添加一堆巨大的矩形似乎速度非常慢。@cHao这是事实,只有当矩形具有相似的大小时才是理想的