So-net無料ブログ作成

なんちゃってMathematicaを作る - その16 [なんちゃってMathematica]

ひさしぶりに「なんちゃってMathematica」に戻ることにする。これまでを思い出すと、まず全体の構造を決めた。それは
  • ユーザインターフェイスはMathematicaのFront Endに似せる
  • 数値計算エンジンはgslを使う
  • 代数演算(式の変形)はやらない
  • インタプリタはlex/yaccを使って自作する
  • 2D/3Dプロットも自作する
といううような方針で行こうとした。これだど、ユーザインターフェイスとインタプリタとプロットを実装すればいいだけになる。しかもインタプリタはMathematicaのシンタクスのおかげで非常に簡単なものに済ますことができる。前回までは2Dプロットをライブラリ(Framework)として実装するための設計を続けていた。APIのイメージはだいたいできた。今日から内部の設計に入ることにする。

4  内部設計

4.1  レイヤ構造

plotContainerにはレイヤ構造を持たせる。

処理は下レイヤにplottableを渡すことで進める。レイヤは
  1. automatic
  2. primitive
  3. normalized
  4. view
の4つ。昔やろうとしたときにこうするのがいいだろう、という結論に至っていた。何でそうするのがいいと思ったのかあまりよく覚えていないけど、まあこれが自然だろう。設計の途中で変更するかもしれない。

automatic以外は使う座標系が違っている。automaticレイヤは数値列を受け取っていろいろなオプションや座標を展開してprimitiveレイヤに渡す。このレイヤがやることは複雑で量も多いということになる。また、automaticレイヤはプリミティブも受け取ることができる。プリミティブはそのままprimitiveレイヤに渡されるだけでいい(はずである)。

その他のレイヤについてはまたあとで考える。

4.2  座標系

座標系は3種類ある。
  1. plot座標
  2. normalized座標
  3. view座標
plot座標はユーザ座標系で、double幅の精度を持つ。normalized座標系は、すべてのplot座標点をかこむAABB(Axis Aligned Bounding Box、オブジェクトが全部含まれる長方形)にいったん納めて、そのAABBを[0,1]区間になるようにplot座標を規格化する。このときplot座標のAABBのアスペクト比を覚えておく。

また、陽にAABBをユーザが指定することで、ユーザの関心領域(ROI - Region Of Interest)の設定にも使うことにする。

ただし、normalized座標のAABBは座標軸やプロットラベルなどは含まない。ユーザが渡したplottableのみを対象にする。また、線の幅や点にうつ星印などの大きさもAABBには含まない。従ってplottableの中には[0,1]区間を超えるような座標値を持つものも存在する。

normalized座標はなくてもかまわない(plot座標から直接view座標を生成する)けど、あったほうが簡単になりそう、というのが前回の考察の結果だった。今回も一応含めることにする。

view座標系は、実際に描画するQuartz座標と同じである。

4.2.1  座標系の混在

ひとつのplottableのなかに異なる座標系の値が含まれることを許すことにする。

この機能は前回考えていたときの、目玉の機能の一つだった。これができれば例えば
  • 表示される文字の大きさをview座標(ポイントサイズ)で表して、表示位置をplot座標で指定して、折れ線の近くに文字を配置するなどができるようにする
  • 座標軸の刻み(tick)は、表示位置はplot座標で、tickの長さはnormalized座標やview座標で指定する
などということをユーザに開放できると同時に、解像度に依存しないことを保証するメカニズムの一つとなる。ようするに銀河の配置をプロットするときであれ水素原子の電子分布をプロットするときであれ、文字や座標軸の刻みの大きさは描画領域の大きさで決めた方が読みやすいし、指定しやすい、ということである。

逆に、座標系の混在をサポートしないとユーザの面倒が増える(文字のサイズをプロット領域の大きさに対する比で指定するなど)、ということになる。

ざっくりまとめると図-2のような感じ。
0203fig02.png
それぞれのレイヤは対応する座標系があるけど、自分より下のレイヤに対応する座標系を含んでいてもよいとする。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0