So-net無料ブログ作成

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

思い出したように続けている「なんちゃってMathematica」シリーズ。忘れそうになるんだけど一度やってくじけたテーマなので案外思い出せる。前回は基本的なプロットオブジェクトになるPrimitiveをおさらいした。プロットオブジェクトと線幅やその色なんかのアトリビュート(Option)の関係を整理した。プロット作業そのものはレイヤに分けて分担しながら進めることにした。今日はそれぞれのレイヤの仕事を整理する。

6  layer再考

layerは
  1. automatic
  2. primitive
  3. normalized
  4. view
の4つ。それぞれのlayerの仕事は
layer 仕事
automatic plotの形式を決める、primitiveに分解する
primitive 座標軸などを生成する、normalized座標に変換する
normalized はみ出し処理を実行する、view座標に変換する
view 実際の描画のためにNSBezierPathなどを生成する
である。普通はひとつ上のレイヤからprimitiveをもらって自分自身用のオブジェクトに変換するのがオブジェクト指向スタイルなんだろうけど、今回はちょっと都合があってこうなった。

それぞれをもう少し詳しく見てみる。

6.1  Automatic layer

primitiveへの分解は、ユーザ用のオブジェクトとしてどういうものを用意するかにもよるけどそれほど難しくない。ただし分解の仕方を決めるのはこのlayerの仕事になる。

たとえば数値列を折れ線グラフにするのか、棒グラフにするのか、などはこのlayerが決めることになる。折れ線グラフであれば開いたlineオブジェクトを生成し、棒グラフなら長方形を表す閉じたlineオブジェクトを生成する。

このlayerはprimitiveも受け付けるが、一番最初に決めたように、むしろNSArrayの中にNSNumberが並んでいるような汎用のオブジェクトを受け付けることにする。ユーザはこの方が使い慣れているはずである。

ただしその場合、渡されてきた構造をパースする必要がある。つまり
渡されたオブジェクト その解釈
NSNumberのNSArray x座標はindex値、y座標はNSNumberの値
NSNumberふたつが入ったNSArrayのNSArray index値が0のNSNumberをx座標、1をy座標
上ふたつが複数含まれたNSArray 複数の座標列
の3通りを受け付けることにして、渡されてきたオブジェクトがどのような構造なのかを見ることでどのように解釈するかを決める。また、この3通り以外に
渡されたオブジェクト その解釈
CPComplexのNSArray 複素数列
も許す。
CPComplexというのはNSValueのサブクラスで、複素数値を保持する。こういう構造をどう解釈するかはautomatic layerのコンテナオブジェクトによる。

6.2  primitive layer

automatic layerからprimitiveに変換されたオブジェクトをnormalized座標に変換する。これ自身は全然難しくない。

primitive layerで一番大きな仕事は座標軸を生成すること。本来ならautomaticレイヤがprimitiveに分解すべきなんだけど、それをするためにはplot全体をカバーするAABBが分からないといけない。そしてAABBはどっちみちnormalized座標に変換するときに計算することになる。そう考えると、automatic layerでやるよりprimitve layerでやるのが効率的である。

automatic layerからは座標軸の形式だけを指定させる。たとえば軸を中に引くか枠と兼用するか、中に引くとしたらxとy軸の交点をどこにするか、目盛(tick mark)を描くか、目盛に値を振るか、ふるとすればどこに描くか、などを指定する。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0