Mystical PostScriptで記述した関数を魔法陣の画像に変換する例

PostScript 言語で作成したプログラムを魔法陣の画像に変換する Mysticle と、PostScript を実行できる Ghostscript (Windows 版の gswin64c) の ps2pdf を用いて、Mysticle の examples フォルダの quicksort.ps のクイックソートの関数のプログラムを魔法陣の画像に変換する例を紹介します。

Mystical.ps で魔法陣画像の生成1

※ gs10.05.1 を使用します。
※ 2025 年 05 月 24 日に GitHub で公開されている mystical_ps, dmmlib リポジトリの複製を使用しています。

前回の記事

前回は、Mysticle公式 GitHub のイントロのページに書かれている用例を、実際に行って、プログラムから魔法陣の画像をファイル出力する手順を紹介しました。

まだ Mysticle を実行する環境を構築していない場合も、以下の記事を参照してください。

今回は、前回の公式イントロで紹介されていた first.ps の内容を参考にして、クイックソートの関数を魔法陣の画像に変換します。

関数自体を貼り付けた ps から魔法陣の画像を作成

公式イントロ「mystical_ps/docs/intro.md at main · denismm/mystical_ps」で紹介されていた first.ps をベースにして、クイックソートの関数を魔法陣の画像に変換するように変更しました。

10 ~ 40 行目の { と } で囲まれている部分は、 mystical_ps/examples/quicksort.ps に書かれている quick 関数定義している { と } までを貼り付けました。

%!PS

(dmmlib/base.ps) run
(mystical.ps) run
(dmmsigils.ps) run

72 dup scale    % make the unit 1 inch
4.25 5.5 translate      % move to the center of an 8.5x11 page
4 dup scale     % make the unit 4 inches
{
    2 dict begin
        /domain exch def
        /swap {
            /a exch def /b exch def
            domain a get domain b get
            domain a 3 -1 roll put
            domain b 3 -1 roll put
        } def
        domain length 2 ge {
            % find pivot
            /hi domain length 1 sub def
            /pivot domain hi get def
            % redistribute
            /fulcrum 0 def
            0 1 hi 1 sub { /i exch def
                domain i get pivot le {
                    i fulcrum swap
                    /fulcrum fulcrum 1 add def
                } if
            } for
            fulcrum hi swap
            fulcrum 1 gt {
                domain 0 fulcrum getinterval quicksort
            } if
            hi fulcrum sub 2 ge {
                domain fulcrum 1 add hi fulcrum sub getinterval quicksort
            } if
        } if
    end
} mystical

showpage

コマンドプロンプトで、前回と同様に、ps2pdf に、先ほど作成した example_quicksort1.ps を渡して、以下のコマンドを実行します。

ps2pdf -dNOSAFER example_quicksort1.ps

何もメッセージが表示されなければ問題ありません。

G:\Dev\Mistical\mystical_ps>ps2pdf -dNOSAFER example_quicksort1.ps

G:\Dev\Mistical\mystical_ps>

コマンドプロンプトのカレントディレクトリをエクスプローラで開くと、 ps ファイル名と同じ example_quicksort1.pdf ファイルが作成されていて、開くと魔法陣の画像が表示されました。

Mystical example_quicksort1.ps から魔法陣の画像を作成した結果

関数の名前を貼り付けた ps から魔法陣の画像を作成

6 行目では、 examples フォルダの quicksoft.ps ファイルを run で実行して、定義されている quicksort 関数を読み込みます。

12 – 16 行目では、読み込まれた quicksort 関数が、現在の辞書 (currentdict) に登録されていることと、登録されている quicksort の確認しています。
※ == によって、結果が標準出力されます。
※これらの確認は、画像の生成に特に必要ではありません。

19 行目では、読み込んだ quicksort 関数を定義した配列を、現在の辞書から取り出して mystical 関数に渡しています。
※ /quicksort とすることで、リテラルネームとして扱います。 quicksort と記述すると Executable Name (実行形式の名前?)として変数や関数として扱われます。

mystical 関数で魔法陣の画像を内部で描画した後、 showpage で1ページの描画内容を確定します。

%!PS

(dmmlib/base.ps) run
(mystical.ps) run
(dmmsigils.ps) run
(examples/quicksort.ps) run

72 dup scale    % make the unit 1 inch
4.25 5.5 translate      % move to the center of an 8.5x11 page
4 dup scale     % make the unit 4 inches

% 現在の辞書に関数が登録されていることを確認
currentdict /quicksort known ==

% quicksort の型を確認
currentdict /quicksort get type ==

% quicksort の {...} の定義を取得して mystical に渡します。
currentdict /quicksort get mystical

showpage

コマンドプロンプトで、前回と同様に、ps2pdf に、先ほど作成した example_quicksort2.ps を渡して、以下のコマンドを実行します。

現在の辞書 (currentdict) に quicksoft が登録されていることを表す true と、quicksort の型の arraytype が標準出力で確認できました。

G:\Dev\Mistical\mystical_ps>ps2pdf -dNOSAFER example_quicksort2.ps
true
arraytype

G:\Dev\Mistical\mystical_ps>

コマンドプロンプトのカレントディレクトリをエクスプローラで開くと、 ps ファイル名と同じ example_quicksort2.pdf ファイルが作成されていて、開くと魔法陣の画像が表示されました。

Mystical example_quicksort2.ps から魔法陣の画像を作成した結果

作成した PDF の魔法陣のベクター画像の編集

作成した PDF の魔方陣のベクター画像編集については以下の記事を参照してください。

まとめ

今回は、PostScript 言語で作成したプログラムを魔法陣の画像に変換する Mysticle と、PostScript を実行できる Ghostscript (Windows 版の gswin64c) の ps2pdf を用いて、Mysticle の examples フォルダの quicksort.ps のクイックソートの関数のプログラムを魔法陣の画像に変換する例を紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました