首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图产生不重叠的气泡。为什么这个不行?

试图产生不重叠的气泡。为什么这个不行?
EN

Stack Overflow用户
提问于 2017-02-14 21:08:03
回答 1查看 223关注 0票数 1
代码语言:javascript
复制
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));
  }
}

我试图使如果一个泡泡与另一个泡泡重叠,它的位置会发生变化,直到它不再重叠一个泡泡。所以,当我所创造的一个新气泡与气泡阵列中的现有气泡之间的距离发生变化时,新气泡的位置就会发生变化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-15 02:21:43

假设你创造了一个泡泡。它是唯一的泡沫,所以它不能重叠任何其他泡沫。到目前一切尚好。然后你创造了另一个泡泡,它不是重叠的第一个,所以你还好。

然后你创造了第三个泡沫。现在你遍历前两个气泡,你发现它不是重叠第一个气泡,而是重叠第二个气泡。所以你给它指定一个随机位置,直到它不再重叠第二个气泡。,但是你不检查它是否再次重叠了第一个气泡。,所以你可以把第三个气泡移动到第一个泡泡的顶部。

将这一逻辑应用于100个气泡,很可能会出现重叠的圆圈。

要解决这个问题,你必须在每次改变位置时重新检查每一个泡沫。这在某一时刻会变得非常缓慢。有更聪明的方法可以做到这一点,所以您可能想研究一下圆填料算法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42236235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档