试图产生不重叠的气泡。为什么这不起作用?

Trying to spawn bubbles that do not overlap. Why doesn't this work?

ArrayList<Bubble> bubbles = new ArrayList<Bubble>();

void setup() {
  size(500, 500);
  background(210);

  for (int i = 0; i < 100; i++) {

    Bubble bubble = new Bubble();

    for (Bubble b : bubbles) {

      float d = dist(b.pos.x, b.pos.y, bubble.pos.x, bubble.pos.y);

      while (d < 40) { // which means 2 * r (radius of bubble)
        bubble.ChangePos();
        d = dist(b.pos.x, b.pos.y, bubble.pos.x, bubble.pos.y);
      }
    }

    bubbles.add(bubble);
  }

  for (Bubble b : bubbles) {
    fill(255, 0, 90, 50);
    b.Display();
  }
}

class Bubble {

  PVector pos = new PVector(random(width), random(height));
  float r = 20;

  void Display() {
    ellipse(pos.x, pos.y, r * 2, r * 2);
  }

  void ChangePos() {
    pos.set(random(width), random(height));
  }
}

我试图做到这一点,如果一个气泡与另一个气泡重叠,它的位置就会改变,直到它不与一个气泡重叠 - 所以当我创建的一个新气泡与气泡数组中现有气泡之间的距离, 新气泡的位置发生变化。

假设您创建了一个气泡。它是唯一的气泡,因此不能与任何其他气泡重叠。到目前为止,一切都很好。然后你创建另一个气泡,它没有与第一个气泡重叠,所以你仍然没问题。

然后你创建第三个泡泡。现在你遍历前两个气泡,你发现它没有与第一个气泡重叠,而是与第二个气泡重叠。所以你给它分配一个随机位置,直到它不再与第二个气泡重叠。 但是你不检查它是否再次与第一个气泡重叠。所以你可以将第三个气泡移动到第一个气泡的顶部。

将该逻辑应用于 100 个气泡,很可能会有重叠的圆圈。

要解决此问题,每次更改位置时都必须重新检查每个气泡。这在某些时候会变得非常慢。有更聪明的方法可以做到这一点,因此您可能需要研究 circle packing 算法。