ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

PostScriptコミュの正六角形タイルパターン

  • mixiチェック
  • このエントリーをはてなブックマークに追加
きむりんと申します。

数年前、

「きむりんさん、一辺5mmの正六角形を画面いっぱい敷き詰めたPSファイルが欲しいんだけど、書ける?」

って言われまして、、、手書きで書いてみましたw

余裕を持って作ったので、1071bytesくらいになりました。

↓に貼り付けますので、これをどのくらい短くできるかやってみませんか? かなり短くなると予想されます。
----ここから----
%!PS
%%Creator: Takeshi KIMURA
%%Title: Sei Rokkaku kei tile pattern
%%CreationDate: Tue Jan 20 13:01:33 JST 2004
%%Pages: 1
%%PageOrder: Ascend
%%DocumentPaperSizes: A4
%%Orientation: Landscape
%%BoundingBox: 0 0 612 792
%%EndComments
%%EndProlog
%%Page: 1 1

/hen 1 def
/resize-factor 72 25.4 div 2.5 mul def
resize-factor resize-factor scale

0.05 setlinewidth

/rokkaku { % - -> -
gsave
5 { % repeat
hen 0 rlineto
60 rotate
} repeat
closepath
stroke
grestore
} bind def

newpath

/num-of-rf-in-A4-yoko 612 resize-factor div ceiling def
/num-of-rf-in-A4-tate 792 resize-factor div ceiling def

/height-of-rokkaku 60 sin 2 mul def
/half-height-of-rokkaku 60 sin def

0 height-of-rokkaku num-of-rf-in-A4-tate { % for j
/j exch def
0 3 num-of-rf-in-A4-yoko { % for i
/i exch def
i j moveto
rokkaku
} for

-1.5 3 num-of-rf-in-A4-yoko { % for
/i exch def
i j half-height-of-rokkaku sub moveto
rokkaku
} for
} for

showpage
%%Page: 2 2
%%Trailer
%%EOF
----ここまで----

まずはGhostViewやAcrobatで六角形を確認してみてください。
お時間のある方のコメントお待ちしております。

コメント(4)

初めましてこんにちは。
いつも GSview で表示されればいいやという気分で書いているので、
ヘッダ等は適当です。

---

%!PS

% pt -> mm
/mm { 25.4 div 72 mul } def

/length 5 mm def

/paper_width 210 mm def
/paper_height 297 mm def

% x y -> ---
/hexagon {
gsave
translate newpath 0 length moveto
5 { 60 rotate 0 length lineto } repeat
closepath stroke
grestore
} bind def

/a length 3 sqrt mul def
/b length 3 mul 2 div def

/y 0 def
paper_height b div ceiling cvi {
/x 0 def
paper_width a div ceiling cvi {
y 2 mod 2 div x add a mul y b mul hexagon
/x x 1 add def
} repeat
/y y 1 add def
} repeat

showpage

---

投稿するとインデントが消えてしまうのが何とも……。
俊之助さん:

きむりんです。僕の方で俊之助さんのスクリプトを測ったところ、525bytesでした。半分ですね。さすがです。

最後のループの内側に二つあったループが一つになってますね。

六角形は基本的に二種類の横方向パターンを繰り返しY軸方向に展開していくと敷き詰められるのですが、俊之助さんのコードはそのへんの1つのループ内で2種類のパターンを使い分けられてますね。


二つのPSファイルを較べると六角形の大きさが半分くらいなのですが、これは僕が1辺5mmと思っていたのが実は2.5mmだったためでした。俊之助さんのPSファイルが正解です(^_^;;)

たしかにインデントが。。。

オペレータを1文字にdefしたりするともっと短くできるかもです。でもできればそれは最後にしたいです。というのもそういうことしたソースはかなり読みにくいので。。。
俊之助さんのコードを参考に、短くしてみました。429bytesになりました。

---
%!PS
/d{def}def/m{mul}d
/rf 72 25.4 div 5 m d
rf rf scale

0.05 setlinewidth

/hexa {
gsave
5 {1 0 rlineto 60 rotate } repeat
closepath stroke grestore
} d

newpath
/frf{ rf div ceiling d} d
/num-rf-x 595 frf
/num-rf-y 842 frf
/s60 60 sin d
/h-hexa s60 2 m d
/hh-hexa s60 neg d

0 h-hexa num-rf-y {/j exch d
0 1 1{/M exch d
M -1.5 m 3 num-rf-x {
j M hh-hexa m add moveto hexa
}for}for}for

showpage
---
短くはないのですが、patternを使った例です。

%!PS
/d{def}def/m{mul}d/sg{setgray}d/b{bind}d
72 25.4 div 5 m dup scale
0.05 setlinewidth
/A 60 sin 2 m d
<</PatternType 1/PaintType 1/TilingType 1
/BBox [0 0 4 A]
/XStep 3/YStep A
/H{gsave
1 0 moveto 5 {1 0 rlineto 60 rotate } repeat
closepath 0 eq {stroke}{fill}ifelse grestore} b
/h{1 sg 1 H 0 sg 0 H} b
/PaintProc
{ begin
h 1.5 60 sin translate h
end
} b
>>
matrix makepattern setpattern
0 0 48 60
rectfill

showpage

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

PostScript 更新情報

PostScriptのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。