Mac用プロットライブラリ-6 [考え中 - プロットライブラリ]
プロットライブラリ設計の続き。
APIをどうするか、は、まあこのへんにしてあとからもうちょっと突っ込んで修正することに。
実装の方針を考えることに移ろう。その前に座標系をどうするか考えておく。
Mac用プロットライブラリ-4 [考え中 - プロットライブラリ]
プロットライブラリの設計の続き。
線や四角形など、プロットに使う基本的な形状、Primitiveをどうするか。
Primitives
2次元の折れ線や3次元の面などユーザから見れば点列でよいのだが、実際に描画する場合、単純化したデータに一旦分解した方が実装は簡単になる。この単純化したデータ構造をprimitiveと呼ぶことにする。
primitiveには2次元、3次元とも
- point
- line(polygon)
- ellipse
- text
- raster
- group
- style
の7種類にする。最初の4つは読んで字のごとしで、raster primitiveはビットマップイメージのこと、groupは2次元primitiveの集合のことである。複数のprimitiveを描画する場合、かならずgroupにしなければならない。groupの中では順番が意味を持つ。つまりgroupの後ろにあるprimitiveほど上に描画される。groupは入れ子にできる。
groupを単一のprimitiveと見なすことで2次元プロットの描画結果を3次元プロットに貼付けることが出来るようにしよう。
また、最後のstyleはprimitiveの状態を変更するためのものでそれ自身描画はされない。線幅、線や塗りつぶしの色、陰付けなどを指定するためのPrimitiveである。その指定はstyleが含まれたgroupの中のその後ろに位置するprimitiveすべてに影響する。groupが入れ子になっている場合、内側のstyleはその外には影響を及ぼさない。
これは先に言ったOptionと競合する。Optionを使うなら線幅、塗りつぶしの色なんかはすべてOptionで設定すべきだろう。しかし、groupを使って入れ子にできるとなれば、スタイルの設定もスタックにできるようにすべきだろう。そのほうがQuartzとの相性もいい。Mathematicaはスタイルを使い分けてるな。Optionで設定できるスタイルと外で設定するスタイルと。普通の線幅や色は外で設定している、というか全体をラップするGraphicsやGraphics3DしかOptionを持たず、RectangleやLineはOptionがない。このへん、Mathematicaの描画システムのPostScript(MathematicaはAbbreviated PostScript(簡略体)と言ってる)が反映している。う〜ん、どうするか。この決定は後回しにしよう。
2次元の折れ線は内部的にlineに変換される。2次元のバーグラフのバーも一本一本が外枠を表すlineに内部的に変換される。3次元の、例えば立方体もそれぞれの面を表す6つのlineの集合に変換される。
primitiveは定型的なプロットをしたいだけであれば内部的なデータ構造として無視して良い。より微妙な制御をしたいとき、plot objectにデータとして渡すことができるようにする。このへんの感じもMathematicaと同じにする。
いずれにせよ、Primitiveは直接Quartzの命令に変換できるものだけにする。つまりPrimitiveの描画はそのままQuartzに渡せば表示できてしまうものに限る。そうすればX11なんかに比べれば低レベルの描画は非常に簡単になる。
Mac用プロットライブラリ-2 [考え中 - プロットライブラリ]
さて、プロットライブラリにはどんな機能を持たせるか、を考える。
ポイントと機能
- Objective-CベースのCocoa frameworkとする
- cocoaらしいシンプルさを持ったframeworkのインタフェイスにする
- Macの描画機能を、移植性を無視して使い切る(WindowsやほかのUnixは無視する)
- 高い描画効率を目指す
- 2D、3D(SurfaceGraphics)、density、Contourグラフを生成(Mathematicaが生成できるグラフを包含する)
- MacOSX独特の各種描画機能を利用した表現を可能にする
具体的なPlot機能
- 線、ポリゴン、文字列、bitmapの表示
- 2次元グラフ
- MathematicaのListPlotと同様の機能
- 棒グラフ、円グラフなど一般のグラフ描画
- 3次元グラフ
- MathematicaのListPlot3Dと同様の機能
- MathematicaのListDensityPlotと同様の機能
- MathematicaのListContourPlotと同様の機能
- 組み合わせグラフ
- matlabのsurfcと同様の機能
- 任意の2次元データを3次元グラフの任意の面に貼付ける
表現力を高めるための機能
- 線や面の色づけ、破線処理、矢印
- Bezier Smoothing
- 線や面の半透明化(*)
- 2次元プリミティブへの影付け(*)
- 文字列のグリフ選択
- 文字列の3次元面への貼付け
いかにもPDFベースのQuartzの売り文句そのまんま。(*)は既存のプロットライブラリには無い機能で、Quartzを前提にするからこそできる、はず。
その他の機能
- Objective-Cによる簡単なAPI
- デフォルトパラメータのNSDictionaryによるテンポラルな設定/変更
- IllustratorなどPostScript、PDFの編集ソフトに読み込めるPDFファイル生成機能
不要な機能
MathematicaやMatlabにあって、Plotting Frameworkに必要のない機能として
- 関数の直接プロット
- 数値計算、代数計算
などがある。これはつまりMathematicaのListPlotやListPlot3Dは持つが、式を受け付けるPlot、Plot3D、PrarametricPlot、PlarametricPlot3Dはない、ということである。当然式を受け付けないのでそれらの計算機能も必要ない。従ってgnuplotの代用にはならない。計算が必要なら自分で計算してFrameworkに渡せばよい。単なるFrameworkなんだから。
Mac用プロットライブラリ-1 [考え中 - プロットライブラリ]
Macで動くプロットライブラリが欲しい。
おおー、欲しいぞう。
そもそもは
• Free の良質な Plot ライブラリ(framework)が Mac に存在しない
• 既存のライブラリは仕様が古く、
– 出力結果が間延びして美しくない
– 最終的に bitmap になってしまう物が多く、そのあとの編集ができない
– せっかくの PDF ベースの MacOSX の描画機能を使い切れない
– 結果的に描画効率が悪い
• Mathematica、Matlab などの商用ソフトの表現力を簡単に手に入れたい
ということ。
MathematicaやMatlabを持っているのならそれでいいじゃないか、という話もあるが、自分で書いた数値計算ソフトの結果を一旦ファイルに落としてMathematicaで読み直す、というのもいまいちだ。それをやらずに済ますためにMathlinkを書く? 十年前ならあったかもしれないけど(実際にやったわ、昔。悪くはないけどMathematicaべったりになってしまう)もう今更ねえ。
というわけで、自分でやるならどうすればいいか、というのを考えていきたい。最終的にはFrameworkとして実装したい。
現在、Mac で動作する既存の Plot ライブラリには
• gnuplot
• plplot
• PGPLOT
等々があるが、もちろん Mac 専用ではなく、描画にMacではX11 か、その互換コマンドを受け付ける AquaTermとかの上で表示される。X11の表示機能を前提としているので低機能(だがそのあとの描画は速い) でライブラリがかなりの部分の面倒を見ることになる。その結果移植性は高くなるが高機能な MacOSX の Quartz にとっては無駄が多く、ほんのわずかな機能しか使っていない。しかもX11の悪いところをそのまま引き継いで、特に高解像度のプリントにはほとんど対応できない。いきおい、プロプライエタリなMathematicaやMatlabや、エクセルなどを使うことになる。
動機からわかるように
• 既存のライブラリとの互換は考慮しない
• Mathematica から借用した概念を多く使用するが、Mathematica 互換とはしない
とするぞ。
構造のシンプルさ、実装の簡単さを優先したいな。つまりはとことんQuartzとFoundationを使い倒そう、ということ。
さて、どうするか、をこれから考える。先は長いな。