Processingで円が重ならないようにランダムに描く
Processingで円が重ならないようにランダムに描きます。
2点間の距離を出す「dist」を使って、2つの円の半径の合計が2点間の距離より小さくなればOKです。
つまり、cとpの2点間の距離 > cの半径+pの半径の場合に描画されます。
processing本家の掲示板にお世話になりました。
//配列準備 ArrayList <PVector> circles; void setup() { background(0); size(600, 600); //色相・彩度・明度で指定 colorMode(HSB, 360, 100, 100); smooth(); noLoop(); } void draw() { background(0); circles = new ArrayList <PVector>(); addCircle(); for (int i=0; i<circles.size(); i++) { PVector p = circles.get(i); noStroke(); fill(int(random(0,360)),100,100); ellipse(p.x, p.y, p.z, p.z); } } void addCircle() { //10は個数 while (circles.size() < 10) { //大きさが10から100の間 float diameter = random(10, 100); PVector c = new PVector(random(width), random(height), diameter); boolean overlapping = false; for (PVector p : circles) { /* distは2点間の距離を出す dist(x1, y1, x2, y2) この場合は、cとpの2点間の距離 > cの半径+pの半径の場合に描画される cとpの2点間の距離 < cの半径+pの半径の場合は重なってしまう */ if (dist(c.x, c.y, p.x, p.y) < (c.z + p.z)) { overlapping = true; break; } } if (!overlapping) { //配列の要素を追加 circles.add(c); } } } //マウスを押すと再描画 void mousePressed() { redraw(); }