2017-02-14 18 views
1
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)); 
    } 
} 

我試圖讓如果一個氣泡重疊另一個氣泡它的位置變化,直到它不重疊一個氣泡 - 所以當我創建一個新氣泡和氣泡數組中的現有氣泡之間的距離,新泡沫的位置發生變化。嘗試產生不重疊的氣泡。爲什麼這不起作用?

+0

你能描述你做了什麼錯? – Brick

+0

氣泡彼此產卵:( –

+0

我想這是導致問題的集合(隨機(寬度),隨機(高度))。比方說你比較了2個氣泡,並且位置改變了,以避免重疊。另一個泡泡,隨機函數可能會再次將泡泡的位置設置爲與之前比較過的泡泡的位置重合。 –

回答

4

假設你創建了一個泡泡。這是唯一的泡沫,所以它不能與其他泡沫重疊。到現在爲止還挺好。然後你創建另一個泡泡,它不會與第一個泡泡重疊,所以你還是可以的。

然後你創建第三個泡泡。現在你循環前兩個氣泡,並且發現它不與第一個氣泡重疊,但它與第二個氣泡重疊。所以你把它分配給一個隨機位置,直到它不再與第二個泡泡重疊。 但是你不檢查它是否重疊了第一個氣泡。所以你可以將第三個泡泡移動到第一個泡泡的頂部。

將這個邏輯應用到100個氣泡,很可能你會有重疊的圓圈。

要解決此問題,每次更改位置時都必須重新檢查每一個泡泡。這在某些時候會變得非常緩慢。有更聰明的方法來做到這一點,所以你可能想看看circle packing算法。

+0

感謝!非常好的解釋:) –