なんちゃってMathematicaを作る - その14 [なんちゃってMathematica]
昨日気分を一新して「なんちゃってMathematica」のプロット機能の実現のための考察に切り替えることにした。
プロット機能は以前ライブラリとして実現しようとして途中でくじけていたが、そこそこ検討は進んでいた。このままでは実装にはまだ入れないけど、それに近い具体的な内容にしやすい。実装に近いほど進捗が見えやすいし、進んでいる実感があるとモチベーションも維持しやすい。「ほい、ほい」と言う感じで考えが進む。悪い気分ではない。
描画オプションは指定することもできるし、指定がなければデフォルトが使われる。
座標軸などの2次的なオブジェクトはプロットの形式を決めるとデフォルトが決まるが、それを変更することもできる。例えばプロットすべき曲線群が原点を含む平面や空間にある場合は、座標軸は原点を通るように描いたり、適切な個数の刻みを描いたりする。
プロットの形式は入れ物のようなもので、ただ渡されたオブジェクトを描画するだけのものから、立体円グラフ(必要性はほとんど感じないのでやる気はないけど)などのように数値列から複雑なオブジェクトを生成するものまでいろいろ考えられる。
プロットオブジェクトはプロット可能オブジェクト(plottable)を保持する。実はプロットオブジェクトはplottableのコンテナでしかない。これからプロットオブジェクトのことをplotContainerと呼ぶことにする。
プロット機能は以前ライブラリとして実現しようとして途中でくじけていたが、そこそこ検討は進んでいた。このままでは実装にはまだ入れないけど、それに近い具体的な内容にしやすい。実装に近いほど進捗が見えやすいし、進んでいる実感があるとモチベーションも維持しやすい。「ほい、ほい」と言う感じで考えが進む。悪い気分ではない。
3 API
このプロットライブラリはとりあえず「なんちゃってMathematica」に使いたいのでやるんだけど、最終的にはアプリではなくプロットライブラリだけで独立したフレームワークにまとめたいので、APIがちゃんと定義されていないといけない。今の時点でAPIを完全に決めるのは無理だけど、だいたいこんな感じ、というのは決めておこう。3.1 描画
プロットはNSImageをNSViewに描画するのと同じようなイメージで行うことにする。[plotObj plotInRect:rect];このplotObjというのはプロットオブジェクトのインスタンス。これをNSViewのdrawRect:の中で呼んでやるとプロットされる。 また、再描画用に
[plotObj replotInRect:dirtyRect];というのも必要かもしれない。これは再描画の効率を高めるために、一度描いたものを何らかの形でキャッシュして、指定されたdirtyRectの中だけを再描画するためのもの。これは最初のプロット領域の大きさが変わってない、ということが前提。できればこのreplotInRect:メソッドはユーザが明示的に呼ぶのではなく、自動的に呼ばれる方がいい。
3.2 プロットオブジェクト(plotContainer)
プロットオブジェクトは- プロットすべき曲線や曲面の座標
- 線の太さや面の色などの描画オプション
- 座標軸やラベルなどの2次的なオブジェクト
- 折れ線グラフ、棒グラフと言ったプロットの形式
NSArray *line; NSDictionary *options; [plotObj addLine:line withOptions:options];みたいなかっこうかなあ。もうちょっとスマートな形式があればいいけど、まあイメージとしてはこんな感じ。座標は専用のクラスではなく、NSNumberが要素になったNSArrayのような、完全に汎用のものにしたい。
描画オプションは指定することもできるし、指定がなければデフォルトが使われる。
座標軸などの2次的なオブジェクトはプロットの形式を決めるとデフォルトが決まるが、それを変更することもできる。例えばプロットすべき曲線群が原点を含む平面や空間にある場合は、座標軸は原点を通るように描いたり、適切な個数の刻みを描いたりする。
プロットの形式は入れ物のようなもので、ただ渡されたオブジェクトを描画するだけのものから、立体円グラフ(必要性はほとんど感じないのでやる気はないけど)などのように数値列から複雑なオブジェクトを生成するものまでいろいろ考えられる。
プロットオブジェクトはプロット可能オブジェクト(plottable)を保持する。実はプロットオブジェクトはplottableのコンテナでしかない。これからプロットオブジェクトのことをplotContainerと呼ぶことにする。
2011-11-30 21:41
nice!(0)
コメント(0)
トラックバック(0)
コメント 0