给出几个点和圆圈,我怎么知道哪个点位于哪个圆圈中?

时间:2016-10-02 13:25:15

标签: algorithm geometry computational-geometry

给定少量的点数和圆圈(比如100以下),我如何判断哪个点位于哪个圆圈?圆圈可以相交,因此一个点可以位于多个圆圈中。

如果它具有任何相关性,则点和圆心都在六边形网格上对齐,圆的半径也与网格对齐。

经过一番思考,似乎最糟糕的情况总是二次方(当每个点位于所有圆圈中时)......但是如果没有这种情况,可能会有一些方法可以让这个更快很多十字路口?

我正在为AI模拟进行此操作,并且圆/点位置一直在变化,因此我无法提前预先计算任何内容。

3 个答案:

答案 0 :(得分:1)

如果点和圆的数量很小,你可能会蛮力地逃脱它。圆点交叉点相当便宜,100 * 100检查帧不应该损害性能。

如果您完全确定此例程是瓶颈并且需要进行优化,请继续阅读。

您可以尝试使用Bounding Volume Hierarchies的变体。

边界卷层次结构是一个树,其中每个节点覆盖其子节点的整个卷(如果您决定使用具有更高度度的树,则更多)。必须为交叉点测试的卷/对象始终是树的叶节点。

插入,移除和交叉查询的平均运行时间为O(log n)。但是,您必须更新树,因为您的对象是动态的,这是通过删除并重新插入无效节点(不再完全包含其叶节点的节点)来完成的。更新完整树的最坏情况时间为O(n log n)

应该注意,在插入时,应该将一个节点插入到该子树中,以便将子树的体积增加最少量。

Here是Randy Gaul写的一篇很好的博客文章,它很好地解释了动态边界层次结构。

您必须使用圆作为边界卷,除非您可以找到在除叶节点之外的所有节点中使用AABB的方法,并将圆作为叶节点。 AABB更准确,应该给你一个稍微好一点的构造树。

答案 1 :(得分:0)

您可以构建点的kd树。然后,对于每个圆心,您将检索距离以圆半径为界的距离的kd树的所有点。给定M点和N个圈子,复杂性应为M log M + N log M = max(M,N) log M(如果点数和圈数为"分布均匀且为#34;)。

与蛮力成对检查相比,您是否能获得任何收益取决于您的点和圆的几何结构。例如,如果圆的半径相对于点的距离或者cirlce中心的距离很大,那么我认为没什么可期待的。

答案 2 :(得分:0)

不是去完整的二维树,而是基于排序的中间可能性。

对横坐标上的P点进行排序。使用良好的排序算法(比如Heapsort),成本可以建模为S.P.Lg(P)(S是比较/移动的成本)。

然后,对于每个圆圈(它们中的C),通过二分法在排序列表中找到其最左边的点(Xc-R),成本为D.Lg(P)(D是二分法步骤的成本)。然后步进到最右边的点(Xc + R)并每次执行点/圆测试。

这样做,您将无需与圆圈左侧和右侧的点进行比较。设F表示所有圆的[Xc-R,Xc + R]范围内的点的平均分数。

表示点/圆比较的成本,总数可以估算为

S.P.Lg(P)+ D.Lg(P).C + F.K.P.C

与K.P.C进行比较。

比率是

S / K.Lg(P)/ C + D / K.Lg(P)/ P + F.

对于S = D = K的不利假设,对于P = C = 100,我们得到6.6%+ 6.6%+ F.这三个术语分别对应于预处理时间,加速开销和减少的工作量。

假设小圆圈合理,让F = 10%,你可以希望加速x4。

如果在精确的点/圆比较之前使用边界框测试(这不一定是改进),则可以将边界框测试简化为两个Y比较,因为X重叠是隐式的。