SSブログ

Mac用プロットライブラリ-7 [考え中 - プロットライブラリ]

これまでのプロットライブラリのおおまかなAPIを実現するための実装の方針を考えておく。ちょっと詰めてみて実装上無理があるようならAPIの方針も変更しよう。

Frameworkの内部構造

2次元の場合

MacOSXでは描画はNSViewのサブクラスで行われる。これは座標値がfloatのNSPointという2次元で指定され、単位はpointになっている。だからframework内部では2次元プロットは

  1. 受け取ったデータをprimitiveに分解
  2. 座標軸などの描画に必要なoptionを展開
  3. 描画領域を決定してスケーリングを行う
  4. NSViewに描画する


と言う手順となるなず。前回も考えたけどスケーリングの時点でdoubleからfloatへの変換を行う必要がある。

同じように3次元プロットでは

  1. 3次元データを3次元primitiveに分解
  2. 座標軸などの描画に必要なoptionを展開
  3. viewport指定に従って射影変換し2次元primitiveに変換
  4. 以下は2次元primitveとして描画


ということにしよう。

普通はこれを実現するために内部はレイヤ構造、パイプライン構造にするのがわかりやすい。どちらもプロットを何段階かに分けて実現すると言う意味では同じである。一つの段階をレイヤ構造ではレイヤ、パイプライン構造ではステージと呼ぶ。この二つの言葉を普通、どう使い分けてるのかな?実装の一部がハードの上に乗っているような場合(OpenGLとか)はパイプラインと言って、ソフトだけの場合はレイヤと言っているような気もする。パイプラインは処理の中間結果を残さなくて、レイヤでは残るような感じもある。まあ、どうでもええわ、名前なんか。でも名前は決めておかないといけない。プログラミングとは名前を付けることであると言った偉い人がいたけど、その通りだと思う。

これ以降レイヤ(Layer)という言葉を使うことにする。
レイヤはまず2次元では

Automatic layer 最上位のプロットAPI
Primitive layer plot objectがすべてprimitiveに展開されたもののみを持つ
Normalized layer 描画領域を一旦{{0,1},{0,1}}の正方形の中におさめる
View layer 実際の描画を行う
の4つだろうな。 ユーザからは一番上のAutomatic layerしかアクセスできないようにする。Automatic layerは曲線プロットやパイチャートや、というプロットそのものがオブジェクトで、それが分解されてPrimitive layerに渡って全部Primitive Objectの集合に統一される。あとのレイヤにとってObjectは1種類だけというのが簡単でいいでしょ。それに自動生成しなければならない座標軸などとプロットを分離することを考えると、こうなっている方がやっぱり簡単なような気がする。 Normalized layerをひとつの独立したレイヤにしたけど、これもアスペクト変換のことを考えると、入れた方が簡単になると思う。実際にはもうちょっと具体的な設計を進めてみないと決められない。 そうするとやっぱり前回考えた座標系は2つではなく3つあるということになる。 つまり、
  1. Plot座標系
  2. Normalized座標系
  3. View座標系
ちゅう感じ。それぞれ、
Plot座標 APIに使われるdouble幅の座標で、ユーザが使う座標系
Normalized座標 float幅の(0,1)の間にnormalizeされた値を持つ座標
View座標 描画領域に対応したNSPointで指定する座標
と言う位置づけ。 とりあえずAPIからはこの3つを混在して使える、ということにしておく。どうしても面倒になったら分離するけど、なるべく一般的な表現ができるようにしておこう。 次はそれぞれのレイヤが具体的に何をやるかを考えることにする。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

献立02/04献立02/05 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。