|
|||
Java(TM) 3D API 1.2 で仕様が公開されている,javax.vecmath パッケージの,非公式な実装(java ソースコード)です. フリーソフトウェアです.AS IS ベースで提供され,保証は一切ありません.バグレポートやコメントを歓迎します. この実装は,Java3D API 1.2 に基づくものです.ここで提供されている Java 実装は,この全仕様をサポートし,ソースコード公開です. また,vecmath API に関する代数と幾何の基礎を,日本語ドキュメントとしてまとめました. Download API 1.2 Java(tm)
C++ portNow supports Visual C++ 6.0 javax.vecmath を C++ に移植することにしました.vecmath の仕様がユニークであるため,高速な平行 C++ バージョンが作成できる,と考えたからです. Java3D vecmath のデザインは,
という特徴があります.(1)-(3)の設計は,もともと Java の速度上の問題から決定されたと思われます.(1) はオブジェクト指向的にあるいはスレッド セーフ的に良くないスタイルのように見えますが,必要であれば上位でカプセル化することができます(実際 Java3D の SceneGraph ではラッパを作っています). (2) はサブクラス化の際に問題になるかもしれませんが,1つ1つのメソッドが明確で自然な仕事をしているため,セマンティクスの一貫性は保たれるでしょう. (3)は for/while ループと添字による要素アクセスがないため,ライブラリコードの増大をもたらす可能性があります.しかし実際に実装してみるとそうでもないことに気付きました.また,これがこのライブラリの最大の特徴である速度を稼ぐポイントとなっています.また,(4) はとてもよい設計判断だったと思います.コードがセマンティクス的に一貫し,可読性も向上します. 幸運なことに,上記の4つの点は,この C++ 版バージョンをとてもユニークなものにしています.速度に最高のプライオリティを置いているのです.すなわち, 仮想関数呼び出しがなく,new 演算子がなく,inline 化された template をヘビーに使用し,メンバは public で,かつ,各メソッド中の数値計算はパラフレーズされています(ループや配列要素への添字によるアクセスが皆無です). たとえば,Matrix は配列表現を内部にもたないため,Matrix3 の中では次のようなコーディングがされています. template < class T > T Matrix3 < T >::determinant() const { // I believe this is the fastest way, less calculation and no indexing. return m00*(m11*m22 - m21*m12) - m01*(m10*m22 - m20*m12) + m02*(m10*m21 - m20*m11); } もちろん,この C++ バージョンには欠点もあります.
'operatoer[]' は意図的にサポートしませんでした.これを使用したユーザプログラム は速度の問題を起こす可能性があるからです. // a bad user program Vector3d u(1,2,3), v; Matrix3d m(1,2,3,4,5,6,7,8,9); // 'cause this can be very slow for (unsigned i = 0; i < 3; i++) for (unsigned j = 0; j < 3; j++) v[i] = m(i,j)*u[j]; このようなシンタクスはサポートしてもよかったのですが,むしろ,名前の付いたメソッドを使ったほうがよいのです. m.transform(u, &v); // much faster. or v = m*u; // others like this style better. これらは,ずっと高速で,かつ読みやすいものです.ユーザープログラムでは,要素を直接アクセスする必要はほとんどないように多数のメソッドが用意されていますので,そちらを使うように心がけるべきでしょう. その他,以下の特徴があります.
Download API 1.2 C++ port
Links
|
[Feedback] * Mail to: hiranabe@esm.co.jp |