なんちゃってMathematicaを作る - その15 [なんちゃってMathematica]
先日APIのイメージを作ってみたプロットライブラリ。Objective-Cだとなんだか拍子ぬけするような簡単なAPIになってしまう。でもこれでちゃんとしたプロットが描けるならそのほうがいい。今日はもうちょっとAPIのこまかな部分を考えてみる。
関係ないけど最近のso-netどうも重くてやる気がそがれるな。
plotContainerは汎用の座標列だけではなく、plottableも受け付けることにするが、その場合たとえば折れ線グラフを棒グラフにする、とかいうことはできなくなる。ようするにplottableは、線は線、面は面、というふうに具体的に描画される形状を示すということにする。たとえば折れ線グラフ用のPlotContainerは座標列から曲線プリミティブを生成し、円グラフ用のPlotContainerは、色つきの扇型のプリミティブを生成する、というわけである。
plottableには
デリバティブは内部でプリミティブの集合に変換されて描画されることになる。 plottableの例をちょっとあげておく。
プリミティブはそれぞれ読んで字のごとくである。オプションプリミティブに関してはこのあと説明する。
デリバティブはたとえば、プロットマーカは点プリミティブとその位置に相対的な星印などの形になった線プリミティブとの組み合わせになっているとする。
plottableは自分自身を表す情報、例えば点ならその座標、曲線なら座標の列を保持する。さらに色や太さなどの描画オプションを持つことができる。ただし、文字の場合フォントはオプション扱いはしない。これはオブジェクトのサイズがオプション指定でかわってしまうと困るのでしかたない。
オプションはplottableと同列のオブジェクトとしても用意することにする。それがさっきのオプションプリミティブである。plottableの途中に挿入できない(線の途中で太さを変えるとか)ので、plottable自身に設定するのと同じだけど、一応ユーザの利便性のために用意しておく。最終的にどっちかに集約したほうがいい、ということになるかもしれない。
plottableが直接保持するオプションは最優先で使われる。plottableが保持していないオプションは、もし一番近くにあるplottableと同列のオプションが使われ、それがなければplotContainerが保持しているものが使われ、それにもない場合はplottable自身のデフォルトが使われるということにする。こういうのはありがちな処理なので実装としても使い勝手としても問題ないだろう。
これ以外にplotContainerの異なるサブクラスにplotContainerを渡すと、plottableもコピーされる。これは折れ線グラフを棒グラフに変換する、などというときに使う。
また、plotContainerを保持できるplottableも作る。これはプロットした結果を他のプロットに貼付ける、ということを簡単にできるようにするためである。
具体的なAPIのスタイルは実装のところで考えることにする。
関係ないけど最近のso-netどうも重くてやる気がそがれるな。
3.3 プロット可能オブジェクト(plottable)
ユーザが与えた座標列なんかは、プロット可能オブジェクトplottableに変換される、ということにする。plottableが持っている座標は専用のクラスにして細かな最適化ができるようにしておく。plotContainerは汎用の座標列だけではなく、plottableも受け付けることにするが、その場合たとえば折れ線グラフを棒グラフにする、とかいうことはできなくなる。ようするにplottableは、線は線、面は面、というふうに具体的に描画される形状を示すということにする。たとえば折れ線グラフ用のPlotContainerは座標列から曲線プリミティブを生成し、円グラフ用のPlotContainerは、色つきの扇型のプリミティブを生成する、というわけである。
plottableには
- primitive(プリミティブ)
- derivative(デリバティブ)
デリバティブは内部でプリミティブの集合に変換されて描画されることになる。 plottableの例をちょっとあげておく。
- プリミティブ
- 点(point)
- 線(line)
- 楕円(ellipse)
- 文字列(text)
- 画像(raster)
- グループ(group)
- オプション(option)
- デリバティブ
- プロットマーカ
- 長方形、丸角長方形、etc.
- 矢印、etc.
- エレベーションマップ(3次元専用)
プリミティブはそれぞれ読んで字のごとくである。オプションプリミティブに関してはこのあと説明する。
デリバティブはたとえば、プロットマーカは点プリミティブとその位置に相対的な星印などの形になった線プリミティブとの組み合わせになっているとする。
plottableは自分自身を表す情報、例えば点ならその座標、曲線なら座標の列を保持する。さらに色や太さなどの描画オプションを持つことができる。ただし、文字の場合フォントはオプション扱いはしない。これはオブジェクトのサイズがオプション指定でかわってしまうと困るのでしかたない。
3.4 オプション(option)
線の色や太さといったplottableの属性は「オプション」としてまとめる。これは単なるNSDictionaryでplottable自身も、plotContainerも保持することができるとする。オプションはplottableと同列のオブジェクトとしても用意することにする。それがさっきのオプションプリミティブである。plottableの途中に挿入できない(線の途中で太さを変えるとか)ので、plottable自身に設定するのと同じだけど、一応ユーザの利便性のために用意しておく。最終的にどっちかに集約したほうがいい、ということになるかもしれない。
plottableが直接保持するオプションは最優先で使われる。plottableが保持していないオプションは、もし一番近くにあるplottableと同列のオプションが使われ、それがなければplotContainerが保持しているものが使われ、それにもない場合はplottable自身のデフォルトが使われるということにする。こういうのはありがちな処理なので実装としても使い勝手としても問題ないだろう。
3.5 手順
ユーザのプロット手順としては- プロットしたい数値列を作る
- 必要なら追加のplottableも作る
- plotContainerを作って数値列やplottableを登録する
- plotContainerにオプションを設定する
- plotContainerにplotInRect:を投げる
これ以外にplotContainerの異なるサブクラスにplotContainerを渡すと、plottableもコピーされる。これは折れ線グラフを棒グラフに変換する、などというときに使う。
また、plotContainerを保持できるplottableも作る。これはプロットした結果を他のプロットに貼付ける、ということを簡単にできるようにするためである。
具体的なAPIのスタイルは実装のところで考えることにする。
2011-12-07 22:10
nice!(0)
コメント(0)
トラックバック(0)
コメント 0