试图产生不重叠的气泡。为什么这不起作用?
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 算法。
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 算法。