ドラゴンカーブ
awkネタ
ドラゴンカーブ
同じ向きに何回も折り曲げ、折り目が直角になるように開いて出来る曲線
この曲線は自分自身と接することはあっても交わりはしない。
描き始めた点を中心として90度、180度、270度開園して出来る曲線は元の曲線と交わらない
位数orderを大きくするほど複雑な図形になる。
再帰で描きました。
今回はsvgを使って描きます。
まずは、ドラゴンカーブ本体です。
#!/usr/bin/awk -f # dragon.awk BEGIN{ order = 10; plot_start(400,250); move(100,100); dragon(order,200,0,1); plot_end(0); } function dragon(i,dx,dy,sign){ if(i == 0){ draw_rel(dx,dy); }else{ dragon(i - 1,(dx - sign * dy) / 2,(dy + sign * dx) / 2,1); dragon(i - 1,(dx + sign * dy) / 2,(dy - sign * dx) / 2,-1); } }
# svgplot.awk #! /usr/bin/awk -f function plot_start(x, y){ printf("<svg xmlns=\"http://www.w3.org/2000/svg\" "); printf("version=\"1.1\" width=\"%d\" height=\"%d\">\n",x,y); printf("<path d=\""); ymax = y; } function plot_end(plot_close){ if(plot_close) printf("Z"); printf("\" fill=\"none\" stroke=\"black\" />\n"); printf("</svg>\n"); } function move(x, y){ printf("M %g %g ",x,ymax - y); } function move_rel(dx, dy){ printf("m %g %g ",dx, -dy); } function draw(x,y){ printf("L %g %g ",x, ymax - y); } function draw_rel(dx,dy){ printf("l %g %g ",dx , -dy); }
では、実行してみます。
awk -f svgplot.awk -f dragon.awk > dragon.svg