【问题标题】: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 &lt; y2 &lt; y1 + r1 + R)很简单。但是要在元素超出范围时有效地删除它们,您可能需要第二个结构,很可能是堆栈(具有宽松的- 2*R 限制)或优先级队列(具有更严格的- r2 - R 限制)。

如果 R 接近您的圈子的典型大小,这应该可以正常工作。如果没有,四叉树可能会更好,如果你真的遇到一个大圆圈,你只会访问相邻的单元格,而不是因为可能会有更大的圆圈来浪费工作。

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 2021-01-29
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多