Java3D vecmath のデザイン
http://www.objectclub.jp/download/vecmath1
↑のページから抜粋してます
1、すべてのメンバ変数が 'public' である. 2、すべてのメソッド(メンバ関数)が 'final' (non-virtual) である. 3、Matrix や Vector 中に,配列の表現を持たない. 4、Point と Vector が別クラスとして区別されている.
という特徴があります.(1)-(3)の設計は,もともと Java の速度上の問題から決定されたと思われます.(1) はオブジェクト指向的にあるいはスレッドセーフ的に良くないスタイルのように見えますが,必要であれば上位でカプセル化することができます(実際 Java3D の SceneGraph ではラッパを作っています). (2) はサブクラス化の際に問題になるかもしれませんが,1つ1つのメソッドが明確で自然な仕事をしているため,セマンティクスの一貫性は保たれるでしょう. (3)は for/while ループと添字による要素アクセスがないため,ライブラリコードの増大をもたらす可能性があります.しかし実際に実装してみるとそうでもないことに気付きました.また,これがこのライブラリの最大の特徴である速度を稼ぐポイントとなっています.また,(4) はとてもよい設計判断だったと思います.コードがセマンティクス的に一貫し,可読性も向上します.
Tanpopでは
Tanpopoの数学関数はvecmathの思想をそのまま流用しようと思います。
ただし、vecmathでは汎用性を考えて、オブジェクト指向で設計されているため、継承関係にあるクラスがいくつかあります。その際spuerなどの関数を呼び出すのに少し時間がかかってそうなので、そこら辺は改善して生きたいと思います。
vecmathとの比較
vecmathのvecter3Dと自分が作ったCtVector3Dとの動作の比較
大体おんなじくらいの動作をしてくれます、一部はvecmathより早い部分もあります♪
Profiling
Package | Base Time(seconds) | Cumulative Time (seconds) | Calls |
typesComp | 73.897591 | 73.94771 | 1 |
CtVctorr3DTest | 73.897591 | 73.94771 | 1 |
main(java.lang.String[]) void | 73.897591 | 73.94771 | 1 |
org.tanpopo.library.types | 0.025429 | 0.025429 | 16000 |
CtVector3D | 0.025429 | 0.025429 | 16000 |
mod(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D | 0.002985 | 0.002985 | 1000 |
add(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D | 0.002921 | 0.002921 | 1000 |
div(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D | 0.002884 | 0.002884 | 1000 |
mul(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D | 0.002825 | 0.002825 | 1000 |
sub(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D | 0.002723 | 0.002723 | 1000 |
"CtVector3D(float float float)" | 0.001602 | 0.001602 | 2000 |
normalize() void | 0.001444 | 0.001444 | 1000 |
assignmod(org.tanpopo.library.types.CtVector3D) void | 0.001316 | 0.001316 | 1000 |
Magnitude() float | 0.00115 | 0.00115 | 1000 |
assignadd(org.tanpopo.library.types.CtVector3D) void | 0.001012 | 0.001012 | 1000 |
assigndiv(org.tanpopo.library.types.CtVector3D) void | 0.000999 | 0.000999 | 1000 |
assignsub(org.tanpopo.library.types.CtVector3D) void | 0.000957 | 0.000957 | 1000 |
assignmul(org.tanpopo.library.types.CtVector3D) void | 0.000949 | 0.000949 | 1000 |
Magnitude2() float | 0.000849 | 0.000849 | 1000 |
equals(org.tanpopo.library.types.CtVector3D) boolean | 0.000815 | 0.000815 | 1000 |
javax.vecmath | 0.016628 | 0.016628 | 12000 |
Vector3f | 0.011956 | 0.011956 | 7000 |
"Vector3f(float float float)" | 0.006067 | 0.006067 | 2000 |
"cross(javax.vecmath.Vector3f javax.vecmath.Vector3f) void" | 0.001469 | 0.001469 | 1000 |
normalize() void | 0.001408 | 0.001408 | 1000 |
length() float | 0.001082 | 0.001082 | 1000 |
lengthSquared() float | 0.001013 | 0.001013 | 1000 |
dot(javax.vecmath.Vector3f) float | 0.000916 | 0.000916 | 1000 |
Tuple3f | 0.004672 | 0.004672 | 5000 |
add(javax.vecmath.Tuple3f) void | 0.00104 | 0.00104 | 1000 |
sub(javax.vecmath.Tuple3f) void | 0.000991 | 0.000991 | 1000 |
"add(javax.vecmath.Tuple3f javax.vecmath.Tuple3f) void" | 0.000976 | 0.000976 | 1000 |
"sub(javax.vecmath.Tuple3f javax.vecmath.Tuple3f) void" | 0.000912 | 0.000912 | 1000 |
equals(javax.vecmath.Tuple3f) boolean | 0.000753 | 0.000753 | 1000 |
java.lang | 0.006866 | 0.006866 | 16 |
ClassLoader | 0.006866 | 0.006866 | 16 |
loadClassInternal(java.lang.String) java.lang.Class | 0.006753 | 0.006753 | 9 |
"checkPackageAccess(java.lang.Class java.security.ProtectionDomain) void" | 0.000113 | 0.000113 | 7 |
java.io | 0.001196 | 0.001196 | 2 |
PrintStream | 0.001196 | 0.001196 | 2 |
println(java.lang.String) void | 0.001196 | 0.001196 | 2 |