Daily Creative Coding

元「30 min. Processing」。毎日、Creative Codingします。

重ならないように円を描き続ける

/**
* Too Much Circles
*
* @author aa_debdeb
* @date 2015/09/16
*/

float MAX_RADIOUS = 20;
float MIN_RADIOUS = 5;


ArrayList<Circle> circles;

void setup(){
  size(500, 500);
  smooth();
  background(255);
  
  circles = new ArrayList<Circle>();
  
}

void draw(){
  Circle circle = new Circle();
  if(!isOverlapping(circle)){
    circle.draw();
    circles.add(circle);
  }
}

boolean isOverlapping(Circle newCircle){
  if(isOverlappingWithSide(newCircle)){
    return true;
  }
  for(Circle circle: circles){
    if(newCircle.isOverlapping(circle)){
      return true;
    }
  }
  return false;
}

boolean isOverlappingWithSide(Circle newCircle){
  if(newCircle.x - newCircle.radious < 0 || newCircle.x + newCircle.radious > width ||
      newCircle.y - newCircle.radious < 0 || newCircle.y + newCircle.radious > height){
    return true;    
  } else {
    return false;
  }
}

class Circle{
  
  float x;
  float y;
  float radious;
  
  Circle(){
    x = random(width);
    y = random(height);
    radious = random(MAX_RADIOUS - MIN_RADIOUS) + MIN_RADIOUS;
  }
  
  void draw(){
    noStroke();
    fill(0);
    arc(x, y, radious * 2, radious * 2, 0, PI * 2);
  }
  
  boolean isOverlapping(Circle circle){
    float distance = sqrt(sq(x - circle.x) + sq(y - circle.y));
    if(distance < radious + circle.radious){
      return true;
    } else {
      return false;
    }
  }
}