Algorithm 单击画布后快速从数组中查找圆

Algorithm 单击画布后快速从数组中查找圆,algorithm,2d,Algorithm,2d,我的画布上有一组圆圈。它们是随机定位的。我想在快速点击画布后找到圆圈。我不想去想所有的数组,比较每个圆的坐标和光标坐标。我不想通过X-coord或Y-coord对数组排序,实现快速或二进制搜索。是否有任何算法可以简化我的查找命中圆的请求?您正在寻找一种可以非常高效地存储二维坐标的算法。因为您是在浏览器中运行的,所以我推荐使用d3.js实现,它甚至还附带了一个非常好的。您正在寻找一个可以非常高效地存储二维坐标的。既然你在浏览器中运行,我推荐D3.JS实现,它甚至有一个非常好的。 < P>你可以考虑

我的画布上有一组圆圈。它们是随机定位的。我想在快速点击画布后找到圆圈。我不想去想所有的数组,比较每个圆的坐标和光标坐标。我不想通过X-coord或Y-coord对数组排序,实现快速或二进制搜索。是否有任何算法可以简化我的查找命中圆的请求?

您正在寻找一种可以非常高效地存储二维坐标的算法。因为您是在浏览器中运行的,所以我推荐使用d3.js实现,它甚至还附带了一个非常好的。

您正在寻找一个可以非常高效地存储二维坐标的。既然你在浏览器中运行,我推荐D3.JS实现,它甚至有一个非常好的。

< P>你可以考虑使用一个PM四叉树空间数据结构。PM四叉树递归地划分欧几里德n空间,其中每个子树是一个原点,平面上有4个子树,3个空间中有8个子树,等等。作为技术说明,四叉树是指根有4个子树的平面,3个空间称为oct树,等等

通常,对于二维平面,对于Z中的k(整数集),尺寸标注被写为所有点(0,0)到(2^k,2^k)。这样分区就“好”了,因为每个原点都可以被2整除

其思想是没有两个点或多边形可以位于同一象限中。如果象限中有多个点,则必须保持递归分区,直到可以将点或多边形单独放置在象限中,也就是说,直到达到容纳一个点的最小1x1桶。根通常是最大的原点,它有四个子元素。每个子对象都是平面中的一个象限,因此第一个子对象是象限I,第二个子对象是象限II,以此类推

如果将圆存储在pm四叉树中,则可以从与选定点p关联的象限开始快速查找最近的圆。定位选定点的象限后,将查找第一个祖先,即圆

这个最近邻算法的运行速度不会比pm四叉树的高度差,它是(2^k*2^k)=(4^k)=O(k)的对数基4,其中k是我们的“尼斯”上限

它们的实现也很有趣


可以考虑使用PM四叉树空间数据结构。PM四叉树递归地划分欧几里德n空间,其中每个子树是一个原点,平面上有4个子树,3个空间中有8个子树,等等。作为技术说明,四叉树是指根有4个子树的平面,3个空间称为oct树,等等

通常,对于二维平面,对于Z中的k(整数集),尺寸标注被写为所有点(0,0)到(2^k,2^k)。这样分区就“好”了,因为每个原点都可以被2整除

其思想是没有两个点或多边形可以位于同一象限中。如果象限中有多个点,则必须保持递归分区,直到可以将点或多边形单独放置在象限中,也就是说,直到达到容纳一个点的最小1x1桶。根通常是最大的原点,它有四个子元素。每个子对象都是平面中的一个象限,因此第一个子对象是象限I,第二个子对象是象限II,以此类推

如果将圆存储在pm四叉树中,则可以从与选定点p关联的象限开始快速查找最近的圆。定位选定点的象限后,将查找第一个祖先,即圆

这个最近邻算法的运行速度不会比pm四叉树的高度差,它是(2^k*2^k)=(4^k)=O(k)的对数基4,其中k是我们的“尼斯”上限

它们的实现也很有趣


您有多少个圆圈?(规模够大了,几十?数亿?百万?…)这次行动预计会进行多少次?圆圈列表多久更新一次?是否保证没有重叠,最多需要找到一个圆圈?如果你要考虑X和Y坐标来排序(你说“不”),你可以在某个网格上用一定的“瓦片大小”来划分画布,并将圆圈添加到它们接触的3D数组(启动时执行正常的测试)。单击鼠标后,可以获得光标的位置,除以“平铺大小”和“向下四舍五入”以获得三维数组索引,并仅在这些圆中运行hittest。一个圆将在网格[x][y][i]中,您必须保持1D和3D阵列同步(可能创建您自己的对象来管理它们)。不会作为答案发布,因为你说“我不想按x和y排序”。@amit,不多,几个。。大约两三打。到那时,Op是相当困难的。更多的是,我需要计算在圆圈中的命中率。但幸运的是,这并不难。但我请你告诉我,我的案子是否有任何现存的算法?@SparK,我做了你刚才说过的事情。。。我明白你在说什么了。。。。谢谢@nightin_gale如果只有几个圆圈,我不明白为什么不搜索所有圆圈,这是性能瓶颈吗?(根据剖析器的说法?)如果不是,这是一个过早的优化,很可能是不明显的,只需使用简单的线性搜索解决方案。你有多少个圆?(规模够大了,几十?数亿?百万?…)这次行动预计会进行多少次?圆圈列表多久更新一次?是否保证没有重叠,最多需要找到一个圆圈?如果你要考虑X和Y坐标来排序(你说“不”),你可以在某个网格上用一定的“瓦片大小”来划分画布,并将圆圈添加到它们接触的3D数组(启动时执行正常的测试)。点击你就可以得到