Mac用プロットライブラリ-3 [考え中 - プロットライブラリ]
visulalizetion frameworkのAPI
Frameworkの使い勝手をどうするか、そのためのAPIを具体的に考える。
Objective-Cは名前空間をサポートしないので他のframeworkの名前と衝突しないようにしなければいけない。何か決めなければいけないので、このframeworkの中のクラスはCP(CocoaPlot)で始まる名前を持つようにしよう。例えばCPPlot2Dなど。まあ、こんな話は実装を始めてからでいいのにね。日本人は形から入る。
Objective-CのFrameworkなのでインターフェイスとしてはオブジェクトにメッセージを投げる動作でPlotが行われるようにする。
Plot手順は
- plot objectを生成し初期化
- object生成
- plotデータを渡す
- 描画オプションを設定
- 表示を行うviewの-drawRect:の中でplotのためのメッセージを投げる
- viewの破棄とともに破棄
とする。
plot objectはプロットのスタイルごとに専用のクラスから生成されるとする。
データの形式
他のプロットライブラリとの差別化の意味も考えて、プロット用のデータには専用のコンテナ形式を使う事にする、非常に冗長だが。
例えば2次元の一つの点を表すのに
@interface CPPlotPosition : CPPostion { double x; double y; } ... @end
というobjectを使用することにしよう。
たとえば2次元plot objectは渡されたデータが
- CPPlotPosition一つならそこに点を打つ
- CPPlotPositionのNSArrayならそれを繋いだLineを描く
- CPPlotPositionのNSArrayがNSArrayになっていたら複数のLineを描く
- CPPlotPositionでなく、NSNumberが入っていたらArrayのIndexをx座標に、NSNumberの値をy座標に持つようなCPPlotPositionに変換してから描く
とする。なるべくMathematicaに感触が近くなるようにしよう。当然plot objectは渡されてきたデータがどのような構造をしているか、parseする必要がある。
データの追加と編集
すべてのデータは追加だけを許すことにしよう。線の延長や線そのものの新たな追加が行える。後から説明するつもりだが、描画要素のひとつであるgroupにも新しい描画要素を追加できる。ただし、データの削除、順番の入れ替え、他のものとの置き換えは許さない。この場合は新しいデータの集合を作り直すことにする。これはインターフェイスを単純にするためで、ようするに完全にMutableにすると、要素の位置の指定や入れ替えをすべての描画オブジェクトがサポートしなければならなくなるのが面倒なので。効率は悪くなるが実装は楽であるのでそちらを優先することにする。
それとも複数の描画要素を保持できる描画要素はぜんぶNSMutableArrayのサブクラスにするか。NSMutableArrayはクラスクラスタなのでサブクラス化は注意が必要だが、それほど難しくはない。そうすればNSMutableArrayの編集のためのメソッドは全部使える。もしそれで一貫性が損なわれることがなければ、どっちが簡単か、で決めよう。あとで。
option(オプション)
plot objectはoptionというNSDictionaryを受け付ける。optionはMathematicaのオプションと同じように描画動作に変更を加える。例えば
- axesを描くかどうか
- frameで囲うかどうか
- アスペクトを保持するかどうか
- axesoriginをどこにするか
- 折れ線のスタイル
- ポイントのシンボル
- スムージングするかどうか
optionのエントリとして決まったkeyをあらかじめ定義しておく。その値として
- Automatic
- None
- True(あるいはYES)
- False(あるいはNO)
などの汎用の値(NSStringのobject)、あるいは直接、指定する数値やそのArrayをとる。keyごとにどのようなobjectが値になり得るか決まっているとする。これもMathematicaのオプション引数のイメージで。
プロットクラスごとにデフォルトのオプションを持っていて、テンポラルにオプションが渡されるとそっちが優先される。デフォルトオプションはそれぞれのクラスメソッドで書き換えられる、と言う風な感じ。
2次元plot objectの例
例えば2次元の折れ線グラフobjectは
@interface CPPlot2D : CPPlottable { NSMutableArray *plottables; NSDictionary *temporalOptions; } - (id)initWithPoints:(id)pointArray withOptions:(NSDictionary *)options; @end
のようなインタフェイスにしよう。CPPlottableはすべてのplot objectの親クラスで
@interface CPPlottable : NSObject { NSDictionary *defaultOptions; ...... } + (NSDictionary *)defaultOptions; + (void)setDefaultOptions:(NSDictionary *)defaultOptions; - (void)plotInRect:(NSRect)rect; - (void)plotInRect:(NSRect)rect operation:(NSCompositingOperation)op fraction:(float)delta; @end
みたいな感じにしよう。CPPlottable自信は何も描画しないobjectで抽象クラスの性質を持っている。
とりあえずこうしておいて、具体的に進んだときもう一度見直すことにする。NSMutableArrayのサブクラスにするかどうかを含めて。
コメント 0