(Application) DCLのPSファイルのトーンを結合する

注意

2011-08-29 現在、うまく行かないケースがあることがあることが判明している(座標の向きによるなど;未対応)。仕様に際しては注意されたい(なお本コマンドは無保証である)。

dclpstonemerge の概要

作者: 堀之内 武

ダウンロード:dclpstonemerge

DCL で作られるPS (PostScript)ファイルでは,uetone によっる色塗りは(もとデータの格子に合わせて)格子状に分割されています.このため,格子点数の多いデータから作った PS ファイルのサイズは一般に大きくなります(数MBになることもざらでしょう).また,パソコンの画面で表示するとこの分割のところに割れ目が入って見えることがあります(割れ目ができるのは画面表示のアンチエリアス機能の副作用なのだそうです.印刷すれば問題ありません.).この症状は PDF ファイルにしても同じですので,例えば電子ジャーナルにのる論文の図に割れ目が入って見えてしまい美しくないということが起こります.

分割を結合すればファイルサイズが減り,パソコン画面上でも綺麗に見えます.コマンド dclpstonemerge は,DCL で作られた PS ファイルを読み込み,隣接する同じ色の区画を結合して PS ファイルとして出力します.なお,本コマンドの適用対象は DCL で作られた PS ファイルであればよく,DCL の Fotran 版,Ruby 版等々のいずれを用いて作成されたものであるかは関係ありません.ただし,本コマンドの実行には Ruby インタープリター(rubyコマンド)がインストールされていることが必要です.

使用法

コマンドライン上で次のように使います.

dclpstonemerge psfile > outputfile

ここで,psfile は入力ファイルのパスです(dcl.ps)など.outputfile は出力するファイル名で,適当につけます(dcl_merged.psなどなど).--- 出力先は標準出力ですので,ファイルに収めるにはこのようにし,引き続き他のコマンドに引き継ぐ場合はパイプラインを使うとよいでしょう.

使用例

DCL付属のデモプログラム demo/rakuraku/color/color3.f で作られる図を例にします.このプログラムで直接画像ファイルを作成すると このサイト(RubyDCL demo-program image index - RAKURAKU) の上で color/color3.rb と書かれたところの下の画像のようになります(なお color3.rb は color3.f の Ruby 版ソースです).

PostScript ファイルは次のように作ります(以下コマンドラインで.$ は入力待ちのプロンプトを表します).

$ cd DCLを展開したディレクトリ
$ cd demo/rakuraku/color
$ dclfrt color3.f
f95 -O -w color3.f -L/usr/local/lib -lf77dcl533 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lz -lfontconfig -lgdk_pixbuf-2.0 -lm -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lm
$ ./a.out
  WORKSTATION ID (I)  ? ;
 1:X, 2:PS, 3:Tek, 4:Gtk ;
2
 *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  2.
 *** WARNING (STSWTR) ***  WORKSTATION VIEWPORT WAS MODIFIED.
 *** MESSAGE (SWPCLS) ***  GRPH1 : PAGE =   1 COMPLETED.
 *** MESSAGE (SWDCLS) ***  GRPH1 : TERMINATED.

すると dcl.ps というファイルができます.これを gv コマンドで画面に表示する:

$ gv dcl.ps 

と,このようになります:

dcl_ps_orig.png

よくみると青っぽいところに縦の割れ,赤っぽいところに横の割れがあるのがわかるでしょう(繰り返しになりますが,これは画面上でのみおきる現象で,印刷すれば割れることはありません.PDFでも同様.).

そこで本コマンドで隣接する同じ色の区画を結合します.

$ dclpstonemerge dcl.ps > dcl_merged.ps

これを gv コマンドで画面に表示する(gv dcl_merged.ps)と,このようになります:

dcl_ps_tonemerged.png

割れはありません.ファイルサイズは 250 kB から 124 kB に減りました.この例ではもとデータの格子点数が大きくないのであまり減りませんが,より格子点数が大きい場合,例えば数 mB から数 100 kB に減ったりします.

アルゴリズムと注意

単連結でない領域は一つの多角形では表せません.本コマンドはそういった場合右側に割れ目を入れます(実際には,入れなくてもいいところに割れ目が入ってしまう場合もあるように見えますが ^^;).結合アルゴリズムは次のようになってます.(以下,uetoneで作られる分割された多角形を SZTN ブロックと呼びます.)

  • SZTNブロックを貯めておくプール(配列)を用意
  • SZTN領域毎のloop処理: while で 新規SZTNブロックを読み込む
    • 作業ブロックの有無
      • なければこれを作業ブロックとする
      • あれば上から結合を試みる
        • 結合できた --> 作業ブロックが拡張された形で更新される
        • 結合不可 --> これまでの作業ブロック結合不可確定 --> (まだなら)プールに入れる --> 今回読んだブロックを作業ブロックとする
    • 作業ブロックをプール内の配列に順に右から結合できないか調べる
      • できたらする --> 結合先が作業ブロックになる
    • loop終了後に作業ブロックをプールに

本コマンドでの結合は PostScript におけるx,y軸に平行な線で行いますので,地図投影には対応しません.ただし,円筒座標ではうまくいくのではないかと思います(未確認).

現在の実装では uetone を用いず sztnzu 等を直接使って書いた図形が混じっている場合,うまく行かない場合もありえます.うまく行かないのは,その図形が反時計回りでなく,かつ,他の図形と x または y 軸に平行な線分で結合が可能な場合だけのはずです.

更新日時:2011/08/29 19:09:28
キーワード:[DCL] [PostScript] [PDF] [割れ]
参照:[(Application) DCLのPSファイルのトーンを結合する2]