改良してみた

  • 図の位置と大きさの調整は、パラメトロン計算機: 多面体描画道楽 でも紹介されている concat を使うと便利です。
    • 平行移動だけなら translate、スケールの変更だけなら scale を使うといいです。
    • 但し、線の太さが変わるので注意。
  • yz平面に対して反転するより、y または z 軸(正五角形の向きによる)回りに 180°回転する方が綺麗にまとめらます。
  • 上のコードでは map 等を使うとき配列の各要素にいちいち名前をつけていますが、PostScript らしくスタック上に置かれた後すぐに1回だけ使う物には名前をつけないようしました。
%!PS
gsave
    40 dict begin
        /map{
            [ 3 1 roll forall ]
        }def
        /select{
            1 dict begin
                /proc exch def
                [ exch { dup proc not { pop }if } forall ]
            end
        }def
        /set-sub{
            1 dict begin
                /set2 exch def
                {
                    true set2{2 index ne and}forall
                    exch pop
                }select
            end
        }def

        /.x{ 0 get }def
        /.y{ 1 get }def
        /.z{ 2 get }def
        /x{ self .x }def
        /y{ self .y }def
        /z{ self .z }def
        /rot_x{
            1 dict begin
                /self exch def
                [x z y neg]
            end
        }def
        /rot_y{
            1 dict begin
                /self exch def
                [z neg y x]
            end
        }def
        /rot_z{
            1 dict begin
                /self exch def
                [y x neg z]
            end
        }def
        /rot_xv{
            4 dict begin
                /a exch def
                /self exch def
                /c a cos def
                /s a sin def
                [x   y c mul z s mul add   z c mul y s mul sub]
            end
        }def
        /rot_yv{
            4 dict begin
                /a exch def
                /self exch def
                /c a cos def
                /s a sin def
                [x c mul z s mul sub   y   z c mul x s mul add]
            end
        }def
        /rot_zv{
            4 dict begin
                /a exch def
                /self exch def
                /c a cos def
                /s a sin def
                [x c mul y s mul add   y c mul x s mul sub   z]
            end
        }def
        /vec{
            2 dict begin
                /p exch def
                /self exch def
                [ x p .x sub   y p .y sub   z p .z sub ]
            end
        }def
        /dot{
            2 dict begin
                /p exch def
                /self exch def
                [
                    y p .z mul z p .y mul sub
                    z p .x mul x p .z mul sub
                    x p .y mul y p .x mul sub
                ]
            end
        }def

        /l0 5 sqrt 3 add 2 div def
        /l1 5 sqrt 1 add 2 div def
        /l2 1 def
        [
            [[l0 l2 neg 0] [l1 l1 neg l1] [l2 0 l0] [l1 l1 l1] [l0 l2 0]]
            dup{rot_x}map{rot_y}map
            dup{rot_y}map{rot_z}map
        ]{
            dup{180 rot_xv}map
            1 index{180 rot_yv}map
            2 index{180 rot_zv}map
        }map
        {{15 rot_zv -15 rot_yv}map}map
        /dodeca exch def

        /visible dodeca{
            1 dict begin
                /pent exch def
                pent 0 get pent 1 get vec
                pent 2 get pent 1 get vec
                dot 0 get 0 ge
            end
        }select def
        /invisible dodeca visible set-sub def

        [50 0 0 50 300 300]concat
        0.02 setlinewidth
        [[invisible 0.8] [visible 0]]{
            aload pop
            setgray
            {
                dup 0 get
                dup .y exch .z moveto
                {
                    dup .y exch .z lineto
                }forall
                closepath
                stroke
            }forall
        }forall
        showpage
    end
grestore