00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOM_VECMAT4_OP_HH
00020 #define GEOM_VECMAT4_OP_HH
00021
00022 #include "constants.hh"
00023
00024 #include <ost/geom/module_config.hh>
00025 #include <ost/geom/vec4.hh>
00026 #include <ost/geom/vec3.hh>
00027 #include <ost/geom/mat4.hh>
00028 #include <ost/geom/mat3.hh>
00029
00030 namespace geom {
00031
00032
00034 inline Real Length2(const Vec4& v)
00035 {
00036 return v[0]*v[0]+v[1]*v[1]+v[2]*v[2]+v[3]*v[3];
00037 }
00038
00040 inline Real Length(const Vec4& v)
00041 {
00042 return std::sqrt(Length2(v));
00043 }
00044
00046 inline bool Equal(const Vec4& v1, const Vec4& v2, Real epsilon=EPSILON)
00047 {
00048 return std::fabs(v1[0]-v2[0])<epsilon &&
00049 std::fabs(v1[1]-v2[1])<epsilon &&
00050 std::fabs(v1[2]-v2[2])<epsilon &&
00051 std::fabs(v1[3]-v2[3])<epsilon;
00052 }
00053
00055 inline bool Equal(const Mat4& m1, const Mat4& m2, Real epsilon=EPSILON)
00056 {
00057 return std::fabs(m1(0,0)-m2(0,0))<epsilon &&
00058 std::fabs(m1(0,1)-m2(0,1))<epsilon &&
00059 std::fabs(m1(0,2)-m2(0,2))<epsilon &&
00060 std::fabs(m1(0,3)-m2(0,3))<epsilon &&
00061 std::fabs(m1(1,0)-m2(1,0))<epsilon &&
00062 std::fabs(m1(1,1)-m2(1,1))<epsilon &&
00063 std::fabs(m1(1,2)-m2(1,2))<epsilon &&
00064 std::fabs(m1(1,3)-m2(1,3))<epsilon &&
00065 std::fabs(m1(2,0)-m2(2,0))<epsilon &&
00066 std::fabs(m1(2,1)-m2(2,1))<epsilon &&
00067 std::fabs(m1(2,2)-m2(2,2))<epsilon &&
00068 std::fabs(m1(2,3)-m2(2,3))<epsilon &&
00069 std::fabs(m1(3,0)-m2(3,0))<epsilon &&
00070 std::fabs(m1(3,1)-m2(3,1))<epsilon &&
00071 std::fabs(m1(3,2)-m2(3,2))<epsilon &&
00072 std::fabs(m1(3,3)-m2(3,3))<epsilon;
00073 }
00074
00076 inline Real Dot(const Vec4& v1, const Vec4& v2)
00077 {
00078 return v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]+v1[3]*v2[3];
00079 }
00080
00081 inline Vec4 Normalize(const Vec4& v)
00082 {
00083 Real l=Length(v);
00084 if(l==0.0) {
00085 return v;
00086 }
00087 return v/l;
00088 }
00089
00091 inline Vec4 CompMultiply(const Vec4& v1, const Vec4& v2)
00092 {
00093 Vec4 nrvo(v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2],v1[3]*v2[3]);
00094 return nrvo;
00095 }
00096
00098 inline Vec4 CompDivide(const Vec4& v1, const Vec4& v2)
00099 {
00100 Vec4 nrvo(v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2],v1[3]/v2[3]);
00101 return nrvo;
00102 }
00103
00105 inline Vec4 operator*(const Vec4& v,const Mat4& m)
00106 {
00107 Vec4 nrvo(v[0]*m(0,0)+v[1]*m(1,0)+v[2]*m(2,0)+v[3]*m(3,0),
00108 v[0]*m(0,1)+v[1]*m(1,1)+v[2]*m(2,1)+v[3]*m(3,1),
00109 v[0]*m(0,2)+v[1]*m(1,2)+v[2]*m(2,2)+v[3]*m(3,2),
00110 v[0]*m(0,3)+v[1]*m(1,3)+v[2]*m(2,3)+v[3]*m(3,3));
00111 return nrvo;
00112 }
00113
00115 inline Vec4 operator*(const Mat4& m, const Vec4& v)
00116 {
00117 Vec4 nrvo(v[0]*m(0,0)+v[1]*m(0,1)+v[2]*m(0,2)+v[3]*m(0,3),
00118 v[0]*m(1,0)+v[1]*m(1,1)+v[2]*m(1,2)+v[3]*m(1,3),
00119 v[0]*m(2,0)+v[1]*m(2,1)+v[2]*m(2,2)+v[3]*m(2,3),
00120 v[0]*m(3,0)+v[1]*m(3,1)+v[2]*m(3,2)+v[3]*m(3,3));
00121 return nrvo;
00122 }
00123
00124
00125 Real DLLEXPORT_OST_GEOM Comp(const Mat4& m, unsigned int i, unsigned int j);
00126
00127
00128 Real DLLEXPORT_OST_GEOM Minor(const Mat4& m, unsigned int i, unsigned int j);
00129
00130 Real DLLEXPORT_OST_GEOM Det(const Mat4& m);
00131 Mat4 DLLEXPORT_OST_GEOM Transpose(const Mat4& m);
00132 Mat4 DLLEXPORT_OST_GEOM Invert(const Mat4& m);
00133 Mat4 DLLEXPORT_OST_GEOM operator*(const Mat4& m1, const Mat4& m2);
00134 Real DLLEXPORT_OST_GEOM Angle(const Vec4& v1, const Vec4& v2);
00135
00137 inline Vec4 Min(const Vec4& v1, const Vec4& v2)
00138 {
00139 Vec4 nrvo(std::min(v1[0],v2[0]),
00140 std::min(v1[1],v2[1]),
00141 std::min(v1[2],v2[2]),
00142 std::min(v1[3],v2[3]));
00143 return nrvo;
00144 }
00145
00147 inline Vec4 Max(const Vec4& v1, const Vec4& v2)
00148 {
00149 Vec4 nrvo(std::max(v1[0],v2[0]),
00150 std::max(v1[1],v2[1]),
00151 std::max(v1[2],v2[2]),
00152 std::max(v1[3],v2[3]));
00153 return nrvo;
00154 }
00155
00156 }
00157
00158 #endif