繁体   English   中英

尝试生成不重叠的气泡。 为什么不起作用?

[英]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个气泡,很可能会出现重叠的圆圈。

要解决此问题,每次更改位置时,您都必须针对每个气泡进行重新检查。 在某些时候这将变得极其缓慢。 有更聪明的方法可以做到这一点,因此您可能需要研究圆形填充算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM