まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

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();
    }