我用随机位置和半径的圆圈填充二维空间。
我还想创建一个图形,其中每个圆都是一个顶点,并且边缘是其他相交的圆。
我的问题是:有没有一种有效的方法来创建这种图表?
显然只是检查每个圆圈的强力方法。我还想过,我可以在2-D平面上叠加网格并对圆圈进行排序,这样我就可以轻松找到特定区域的圆圈。
以下是我合作的一个例子:
答案 0 :(得分:0)
示例图像建议您在圆的半径上可能有一个上限 R ,它远小于矩形的总边长。如果是这种情况,您可能想尝试以下内容:
Sort all circles by x coordinate of center
Maintain a list L of circles, sorted by y coordinate of center, initially empty
For each circle C1 in order of x coordinates:
Drop all elements C2 from L where x2 < x1 - 2*R (or x2 < x1 - r2 - R)
For each circle C2 in L where |y1 - y2| < r1 + R:
Check C1, C2 for intersection, possibly add to result
Add C1 to L, maintaining order by y coordinates
L
可能是一个红黑树或类似的东西,执行范围查询(即y1 - r1 - R < y2 < y1 + r1 + R
)很简单。但是要在元素超出范围时有效地删除元素,您可能需要第二个结构,很可能是堆栈(具有松散的- 2*R
限制)或优先级队列(具有更严格的- r2 - R
限制)。
如果 R 接近您圈子的典型尺寸,这应该可以正常使用。如果没有,一个四叉树可能会更好,如果你真的遇到一个大圆圈,你只会访问相邻的单元格,而不是因为可能还有一个biger圈而浪费工作。