· 

コッホ曲線

(著)山たー

フラクタルな図形を書いてみたシリーズ3。プログラムは、左クリックで階層が一つ増し、右クリックで階層が一つ減る。久しぶりに複素数の回転を使った気がする。

ソースコード

int num=1;
float edge=400;
float y=130;
void setup(){
  size(500,500);
  noLoop();
  background(255);
}

void draw(){
  background(255);
  Disp_Koch(width/2-edge/2,y,width/2+edge/2,y,num);
  Disp_Koch(width/2+edge/2,y,width/2,y+sqrt(3)*edge/2,num);
  Disp_Koch(width/2,y+sqrt(3)*edge/2,width/2-edge/2,y,num);
}

void Disp_Koch(float x1, float y1,float x2, float y2,int num){
  stroke(0);
  line(x1,y1,x2,y2);
  if(num>1){
    stroke(255);
    strokeWeight(3);
    strokeCap(SQUARE);
    line(x1,y1,x2,y2);
    strokeWeight(1);
    strokeCap(PROJECT);
    stroke(0);
    float x3=(2*x1+x2)/3;
    float y3=(2*y1+y2)/3;
    float x4=(x1+2*x2)/3;
    float y4=(y1+2*y2)/3;
    float dx=x4-x3;
    float dy=y4-y3;
    float x5=x3+dx*cos(-PI/3)-dy*sin(-PI/3);
    float y5=y3+dx*sin(-PI/3)+dy*cos(-PI/3);
    Disp_Koch(x1,y1,x3,y3,num-1);
    Disp_Koch(x3,y3,x5,y5,num-1);
    Disp_Koch(x5,y5,x4,y4,num-1);
    Disp_Koch(x4,y4,x2,y2,num-1);
    } 
}

void mousePressed() {
  if (mouseButton == LEFT) {
    num+=1;
  } else if (mouseButton == RIGHT) {
    num=max(num-1,0);
  }
  redraw();
}