

平稲妻という家紋で、稲妻をこんな形にデザインするとは驚きです。
真ん中の短い横線を1単位とすると直線の長さが規則的になっています。(下図)1、1、2、2、3、3….
この1単位に任意の大きさ(w)を掛けて適度な大きさにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:家紋を描く(平稲妻) /w 30 def % 全体の大きさを制御 /r { % 相対的長さで線を引くプロシージャ % ★から渡される値は順番が逆になることに注意 /dy exch w mul def % y軸方向の長さをw倍する /dx exch w mul def % x軸方向の長さをw倍する dx dy rlineto % 相対的長さで線を引く } def 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 1 setgray % 白色 % バックの四角形 -3 w mul -3 w mul w 6 mul w 6 mul rectfill 0 0 moveto % (0,0)に始点を置く -1 0 r % ★ 線を引く(-1はdxに、0はdyに引き渡される) 0 1 r 2 0 r 0 -2 r -3 0 r 0 3 r 4 0 r 0 -4 r -5 0 r 0 setgray % 黒色 2 setlinewidth % 線幅2ポイント stroke % 線の描画 |

同じ家紋を今度は配列を使って描いています。
考え方は上のプログラムと同じで、直線の長さを配列に入れているだけです。
図形は上と同じなので省略します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:家紋を描く(三ツ稲妻菱) % 配列を使用する /inazuma [ [-1 0] [0 1] [2 0] [0 -2] [-3 0] [0 3] [4 0] [0 -4] [-5 0] ] def /w 30 def % 全体の大きさを制御 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 /cmtx matrix currentmatrix def % カレント座標を保存する newpath % パスの初期化 1 setgray % 白色 % バックの四角形 -3 w mul -3 w mul w 6 mul w 6 mul rectfill 0 0 moveto % (0,0)に始点を置く w dup scale % 座標を30倍に拡大 0 1 8 { /index exch def % 制御変数をindexに入れる % 配列(inazuma)から順に(index)座標を取り出し(get)、スタックに置き(aload)、 % オペランドは削除(pop)して直線を引く(rlineto) inazuma index get aload pop rlineto } for cmtx setmatrix % 座標を拡大前の座標に復元 0 setgray % 黒色 2 setlinewidth % 線幅2ポイント stroke % 線の描画 |

平稲妻を三つ組み合わせて「三ツ稲妻菱」を描きます。平稲妻を座標変換して菱形にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:家紋を描く(三ツ稲妻菱) /w 15 def % 全体の大きさを制御 /r { % 相対的長さで線を引くプロシージャ % ★から渡される値は順番が逆になることに注意 /dy exch w mul def % y軸方向の長さをw倍する /dx exch w mul def % x軸方向の長さをw倍する dx dy rlineto % 相対的長さで線を引く } def /inazuma { newpath % パスの初期化 1 setgray % 白色 % バックの四角形 -3 w mul -3 w mul w 6 mul w 6 mul rectfill 0 0 moveto % (0,0)に始点を置く -1 0 r % ★ 線を引く(-1はdxに、0はdyに引き渡される) 0 1 r 2 0 r 0 -2 r -3 0 r 0 3 r 4 0 r 0 -4 r -5 0 r 0 setgray % 黒色 2 setlinewidth % 線幅2ポイント stroke % 線の描画 } def % 図形を菱形にするための座標変換の数値 /sx { 30 cos } def /sy { 30 sin } def /sx2 { -30 cos } def /sy2 { -30 sin } def 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 % 菱形を描く gsave % グラフィックス状態の保存 [ 270 cos 270 sin sx sy 41 -20 ] concat % 座標変換 inazuma % 右側面 grestore % グラフィックス状態の復帰 gsave [ sx neg sy2 neg 0 -1 -41 -20 ] concat inazuma % 左側面 grestore gsave [ sx sy sx neg sy2 neg 0 50 ] concat inazuma % 天面 |
コメント