なんちゃってMathematicaを作る - その22 [なんちゃってMathematica]
思い出したように続けている「なんちゃってMathematica」シリーズ。忘れそうになるんだけど一度やってくじけたテーマなので案外思い出せる。前回は基本的なプロットオブジェクトになるPrimitiveをおさらいした。プロットオブジェクトと線幅やその色なんかのアトリビュート(Option)の関係を整理した。プロット作業そのものはレイヤに分けて分担しながら進めることにした。今日はそれぞれのレイヤの仕事を整理する。
である。普通はひとつ上のレイヤからprimitiveをもらって自分自身用のオブジェクトに変換するのがオブジェクト指向スタイルなんだろうけど、今回はちょっと都合があってこうなった。
それぞれをもう少し詳しく見てみる。
たとえば数値列を折れ線グラフにするのか、棒グラフにするのか、などはこのlayerが決めることになる。折れ線グラフであれば開いたlineオブジェクトを生成し、棒グラフなら長方形を表す閉じたlineオブジェクトを生成する。
このlayerはprimitiveも受け付けるが、一番最初に決めたように、むしろNSArrayの中にNSNumberが並んでいるような汎用のオブジェクトを受け付けることにする。ユーザはこの方が使い慣れているはずである。
ただしその場合、渡されてきた構造をパースする必要がある。つまり
の3通りを受け付けることにして、渡されてきたオブジェクトがどのような構造なのかを見ることでどのように解釈するかを決める。また、この3通り以外に
も許す。
CPComplexというのはNSValueのサブクラスで、複素数値を保持する。こういう構造をどう解釈するかはautomatic layerのコンテナオブジェクトによる。
primitive layerで一番大きな仕事は座標軸を生成すること。本来ならautomaticレイヤがprimitiveに分解すべきなんだけど、それをするためにはplot全体をカバーするAABBが分からないといけない。そしてAABBはどっちみちnormalized座標に変換するときに計算することになる。そう考えると、automatic layerでやるよりprimitve layerでやるのが効率的である。
automatic layerからは座標軸の形式だけを指定させる。たとえば軸を中に引くか枠と兼用するか、中に引くとしたらxとy軸の交点をどこにするか、目盛(tick mark)を描くか、目盛に値を振るか、ふるとすればどこに描くか、などを指定する。
6 layer再考
layerは- automatic
- primitive
- normalized
- view
layer | 仕事 |
---|---|
automatic | plotの形式を決める、primitiveに分解する |
primitive | 座標軸などを生成する、normalized座標に変換する |
normalized | はみ出し処理を実行する、view座標に変換する |
view | 実際の描画のためにNSBezierPathなどを生成する |
それぞれをもう少し詳しく見てみる。
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 | 複数の座標列 |
渡されたオブジェクト | その解釈 |
---|---|
CPComplexのNSArray | 複素数列 |
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)を描くか、目盛に値を振るか、ふるとすればどこに描くか、などを指定する。
2012-04-15 20:32
nice!(0)
コメント(0)
トラックバック(0)
コメント 0