ドラゴンカーブ

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);
    }
}

次にSVGを出力するawkを作成します。

# 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

awksvgを使って絵を描く事が出来ました。