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));
}
}我试图使如果一个泡泡与另一个泡泡重叠,它的位置会发生变化,直到它不再重叠一个泡泡。所以,当我所创造的一个新气泡与气泡阵列中的现有气泡之间的距离发生变化时,新气泡的位置就会发生变化。
发布于 2017-02-15 02:21:43
假设你创造了一个泡泡。它是唯一的泡沫,所以它不能重叠任何其他泡沫。到目前一切尚好。然后你创造了另一个泡泡,它不是重叠的第一个,所以你还好。
然后你创造了第三个泡沫。现在你遍历前两个气泡,你发现它不是重叠第一个气泡,而是重叠第二个气泡。所以你给它指定一个随机位置,直到它不再重叠第二个气泡。,但是你不检查它是否再次重叠了第一个气泡。,所以你可以把第三个气泡移动到第一个泡泡的顶部。
将这一逻辑应用于100个气泡,很可能会出现重叠的圆圈。
要解决这个问题,你必须在每次改变位置时重新检查每一个泡沫。这在某一时刻会变得非常缓慢。有更聪明的方法可以做到这一点,所以您可能想研究一下圆填料算法。
https://stackoverflow.com/questions/42236235
复制相似问题