Daily Creative Coding

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

月のクレーター

/**
* Crater on Moon
*
* @author aa_debdeb
* @date 2016/02/11
*/

float radious = 250;
ArrayList<Crater> craters;

void setup(){
  size(500, 500);
  frameRate(180);
  background(0);
  stroke(255, 32);
  strokeWeight(1);
 
  craters = new ArrayList<Crater>();
  for(int i = 0; i < 25; i++){
    float posAng = random(TWO_PI);
    float posR = random(radious);
    float craR = map(sq(random(1)), 0, 1, 3, 5);
    Crater crater = new Crater(new PVector(posR * cos(posAng), posR * sin(posAng)), craR);
    craters.add(crater);
  }
}

void draw(){
  translate(width / 2, height / 2);
  float end1Ang = random(TWO_PI);
  PVector end1 = new PVector(radious * cos(end1Ang), radious * sin(end1Ang));
  float end2Ang = random(TWO_PI);
  PVector end2 = new PVector(radious * cos(end2Ang), radious * sin(end2Ang));
  float slope = (end2.y - end1.y) / (end2.x - end1.x);
  float a = slope;
  float b = -1;
  float c = end1.y - slope * end1.x;
  for(Crater crater: craters){
    float distance = abs(a * crater.position.x + b * crater.position.y + c) / sqrt(sq(a) + sq(b));
    if(distance < crater.radious){
      return;
    }
  }
  line(end1.x, end1.y, end2.x, end2.y);
}

class Crater {
  PVector position;
  float radious;
  Crater(PVector position, float radious){
    this.position = position;
    this.radious = radious;
  }
}