【问题标题】:Creating a graph from a 2-d space populated with circles从填充有圆圈的二维空间创建图形
【发布时间】:2018-05-07 10:52:48
【问题描述】:
我正在用随机位置和半径的圆圈填充二维空间。
我还想创建一个图,其中每个圆都是一个顶点,并且与其他相交的圆有边。
我的问题是:有没有一种有效的方法来创建这种图表?
显然存在只检查每个圆圈的蛮力方法。我还想,我可以在二维平面上叠加一个网格并对圆圈进行某种散列,这样我就可以轻松找到特定区域中的圆圈。
这是我正在使用的示例:
【问题讨论】:
标签:
graph
graphics
geometry
2d
graph-algorithm
【解决方案1】:
示例图像表明您可能在圆的半径上有一个上限 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 接近您的圈子的典型大小,这应该可以正常工作。如果没有,四叉树可能会更好,如果你真的遇到一个大圆圈,你只会访问相邻的单元格,而不是因为可能会有更大的圆圈来浪费工作。