ペンローズタイル

ペンローズタイルを並べる を参考にして PostScript でペンローズタイルを描いてみた。カイト 1 個からスタートして収縮させていった時の様子を表したのが上だか右だかにある図です。
以下はソース。

%!PS

/a 100 def
/phi-1 5 sqrt 1 sub 2 div def
/b a phi-1 mul def

/gexec{
    gsave
        exec
    grestore
}def
/polar_to_orthogonal{
    % r theta -- x y
    2 copy cos mul
    3 1 roll sin mul
}def
/kite{
    dup 0 eq{
        pop
        drawkite
    }{
        1 sub
        dup{
            a 36 polar_to_orthogonal translate
            -108 rotate
            phi-1 dup scale
            kite
        }gexec
        dup{
            a -36 polar_to_orthogonal translate
            108 rotate
            phi-1 dup scale
            kite
        }gexec
        dup{
            36 rotate
            phi-1 dup scale
            dart
        }gexec
        dup{
            -36 rotate
            phi-1 dup scale
            dart
        }gexec
        pop
    }ifelse
}def
/dart{
    dup 0 eq{
        pop
        drawdart
    }{
        1 sub
        dup{
            phi-1 dup scale
            kite
        }gexec
        dup{
            -144 rotate
            a neg 0 translate
            phi-1 dup scale
            dart
        }gexec
        dup{
            144 rotate
            a neg 0 translate
            phi-1 dup scale
            dart
        }gexec
        pop
    }ifelse
}def
/drawkite{
    {
        newpath
        0 0 moveto
        a 36 polar_to_orthogonal lineto
        a 0 lineto
        a -36 polar_to_orthogonal lineto
        closepath
        stroke
    }gexec
}def
/drawdart{
    {
        newpath
        0 0 moveto
        a 36 polar_to_orthogonal lineto
        b 0 lineto
        a -36 polar_to_orthogonal lineto
        closepath
        stroke
    }gexec
}def

0 1 6{
    30 75 translate
    kite
%    dart
    showpage
}for

ダート 1 個からスタートすると、右のようになります。Penrose-Dart