So-net無料ブログ作成

なんちゃってMathematicaを作る - その21 [なんちゃってMathematica]

思い出したようにときどき続けている「なんちゃってMathematica」シリーズ。ここのところプロットライブラリの設計を続けている。前回までで、座標表現を3種類用意すること、その3つを混在して使うことを許すこと、そしてその結果発生する問題の解決策を考えた。

座標表現の話題はこのくらいにして、今日はプロットの基本オブジェクトであるPrimitiveに関してもう一度整理する。

5  Primitives再考

5.1  PrimitiveとOption

primitiveは
point 点、最終的には描画されない
line 曲線
multiLine 複合曲線
ellipse 楕円
text 文字列
raster ビットマップ画像
group グループ
option オプション
の8つにする。
option primitive以外のPrimitiveはすべて
  1. 座標値
  2. (もし必要なら)オプション
を保持する。オプションとは線の色や太さなどの描画するときの属性を保持したもの。オプションはあとで整理するつもりだけどNSDictionaryで、属性名とその値のペアになっている。optionが設定されていなければ、もっとも近いところで設定された値が使われるようなスタック構造にしておく。つまり描画の時点でそれぞれのprimitiveでは
  1. optionがnilかどうか見る
  2. optionが設定されていればoption辞書をスタックに積む
  3. 内容を描画する
  4. スタックトップを取り除く
ということをする。optionスタックは実際にスタックを実装するのではなく、NSGraphicsContextをそのまま使うことにする。NSGraphicsContextはスタックと同じような動作をするので自動的にできてしまうことになる。

ただし、文字列のフォントだけは、文字列オブジェクトを生成したときに独立に指定することにする。そうでないと描画するときまで文字列のAABBが確定できなくなって、normalized→view座標変換がうまくいかなくなる。残念だけどこれはしょうがない。optionを一度パースすればいいけど、それはカッコ悪いしめんどくさい。それにそういう遠いところを参照しにいくようなコードってバグの温床だし。

option primitiveは独立に存在しても描画にはなにも影響しないけど、group primitiveの中ではそれ以降のprimitiveの描画に影響を与える、ということにする。つまりgroupの中が
  1. line1
  2. option(線幅を1ptに)
  3. line2
  4. option(線幅を10ptに)
  5. line3
となっていたとすると、line1の線幅はその直前で設定された値がそのまま使われ、line2は1ポイントで、line3は10ポイントで描かれて、groupの外に出ればまたそこで設定されるまえの値(この場合line1に設定されたものと同じ)に戻る、ということにする。

5.2  Primitiveのその他の性質

点(point)はそれ自身描画されない、ということにした。たとえばグラフに目に見える点をうつ、というような場合はpoint primitiveに対して塗りつぶし円のprimitiveを相対指定することで実現する。こうしておけば点の位置を正確に指定できる(円の中心を点の位置とする)し、点以外の星形や三角形なんか(plot symbolと呼ぶ)も同じ方法で指定できる。そういう形状をライブラリとして作っておいて、コピーしたものの相対座標をpoint primitiveに指定すればいい。そういう形状は描画領域にかかわらず同じ大きさで表示されるべきなのでview座標で形が指定されるはずであるが、表示位置はplot座標で決まるはずである。

ただし、こういったplot symbolも文字列と同じで大きさの指定だけはoptionでは指定できない、ということになる。つまり文字列とplot symbolは大きさはオブジェクトを作るときに決まっていて、色はoptionで指定される、ということになる。ちょっといまいち。まあしょうがない。

line primitiveは折れ線やスムージングた曲線、あるいは長方形や三角形などのsymbolオブジェクトもこれで作る。symbolオブジェクトを表す場合にはlineは閉じて中を塗りつぶさないといけない。これはoptionで指定することにする。

それと、multiLineというのを追加しよう。これは、NSBezierPathでは曲線を描いている途中でmoveToPoint:メソッドを呼ぶと別れた線分が描ける。これに対応するもので、座標軸の目盛(Tick Mark)などをひとつの線分として扱うためのものである。こうしておくとIllustratorなんかに読み込んだとき、小さな線分がバラバラにならずにすむ。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0