Moons

A generative moon

Another generative moon

//Download Processing at https://processing.org
ArrayList lines = new ArrayList<Line>();
PShape mappedShape;

float minLength;
float reduction;
float fov = PI/3f;
float cameraZ = (800/2f) / tan(fov/2f);

boolean drawPlanetMass = true;

void setup(){
  size(800, 800, P3D);
  noCursor();
  blendMode(ADD);
  hint(ENABLE_DEPTH_SORT);
  smooth(8);
  generate();
}

void draw(){
  lights();
  background(0);
  
  if(drawPlanetMass) {
    noStroke();
    fill(0, 20, 30);
    sphere(3950f);
  }
  
  perspective(fov, 1f, cameraZ/10f, 14500f);
  camera(-width/2f, -height/2f, 10250f, 0f, 0f, 0f, 0.0f, 1.0f, 0.0f);
  
  rotateY((TAU*frameCount)/3000);
  rotateY((TAU*mouseX)/width);
  rotateX((TAU*mouseY)/height);
  
  shape(mappedShape);
}

void mouseClicked() {
  generate();
}

void keyPressed() {
  if (key == 'e') {
  }else if(key == 'm'){
    drawPlanetMass = !drawPlanetMass;
  }
}

void generate(){
  lines.clear();
  minLength = random(0.2f, 1f);
  reduction = random(1.8f, 2f);
  Point origin = new Point(width/2, height/2);
  int dendrites = (int) random(1, 8);
  
  for(int i = 0 ; i < dendrites ; i++){
    float angleRnd = random(-1f, 1f);
    float angle = TAU/dendrites * i;
    angle += TAU/dendrites;
    grow(origin, 85f, angle + angleRnd);
  }
  
  mappedShape = createShape();
  mappedShape.beginShape(LINES);
  mappedShape.stroke(255, 40f);
  mappedShape.strokeWeight(0.75f);
  
  int r = 4000;
  
  int linesCount = lines.size();
  
  for(int i = 0 ; i < linesCount ; i++){
    Line line = (Line) lines.get(i);
    
    float x1 = r * (sin(line.a.y) * cos(line.a.x));
    float y1 = r * (sin(line.a.y) * sin(line.a.x));
    float z1 = r * cos(line.a.y);
    PVector start = new PVector(x1, y1, z1);
    
    float x2 = r * (sin(line.b.y) * cos(line.b.x));
    float y2 = r * (sin(line.b.y) * sin(line.b.x));
    float z2 = r * cos(line.b.y);
    PVector end = new PVector(x2, y2, z2);
    
    if(start.dist(end) < r/4) {
      mappedShape.vertex(x1, y1, z1);
      mappedShape.vertex(x2, y2, z2);
    }
  }
  
  mappedShape.endShape();
}

void grow(Point origin, float length, float angle){
  
  if(length < minLength){
    return;
  }

  pushMatrix();
  
  translate(origin.x, origin.y);
  rotate(angle);
  lines.add(new Line(screenX(0f, 0f), screenY(0f, 0f), screenX(length, 0f), screenY(length, 0f)));
  
  for(int i = 0 ; i < 4 ; i++){
    grow(new Point(length / reduction, 0f), length / reduction, random(-6f, 6f));
  }
  
  popMatrix();
}

class Point{
  
  float x;
  float y;
  
  Point(float x, float y){
    this.x = x;
    this.y = y;
  }
}

class Line{
  
  Point a;
  Point b;
  
  Line(float x1, float y1, float x2, float y2){
    a = new Point(x1, y1);
    b = new Point(x2, y2);
  }
}

A generative moon