00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __SIM_DerVector3_h__
00017 #define __SIM_DerVector3_h__
00018
00019 #include "SIM_API.h"
00020 #include <UT/UT_Matrix3.h>
00021 #include <UT/UT_Vector3.h>
00022
00023 class SIM_DerScalar;
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 class SIM_API SIM_DerVector3
00041 {
00042 public:
00043 SIM_DerVector3() { }
00044
00045 explicit SIM_DerVector3(const UT_Vector3 &v) : myV(v), myD(0.f)
00046 { }
00047
00048
00049 SIM_DerVector3(const UT_Vector3 &v,
00050 const UT_Matrix3 &D) : myV(v), myD(D)
00051 { }
00052
00053
00054
00055
00056
00057 const UT_Vector3&v() const
00058 { return myV; }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 const UT_Matrix3&D() const
00073 { return myD; }
00074
00075
00076
00077
00078 SIM_DerVector3 operator-() const
00079 {
00080 return SIM_DerVector3(-v(), -D());
00081 }
00082 SIM_DerVector3 operator+(const SIM_DerVector3 &rhs) const
00083 {
00084
00085 return SIM_DerVector3(v() + rhs.v(), D() + rhs.D());
00086 }
00087 SIM_DerVector3 operator+(const UT_Vector3 &rhs) const
00088 {
00089 return SIM_DerVector3(v() + rhs, D());
00090 }
00091 SIM_DerVector3 operator-(const SIM_DerVector3 &rhs) const
00092 {
00093
00094 return SIM_DerVector3(v() - rhs.v(), D() - rhs.D());
00095 }
00096 SIM_DerVector3 operator-(const UT_Vector3 &rhs) const
00097 {
00098 return SIM_DerVector3(v() - rhs, D());
00099 }
00100 SIM_DerVector3 operator*(const SIM_DerScalar &rhs) const;
00101 SIM_DerVector3 operator*(fpreal scalar) const
00102 {
00103
00104 return SIM_DerVector3(v() * scalar, D() * scalar);
00105 }
00106 SIM_DerVector3& operator+=(const SIM_DerVector3 &rhs)
00107 { return operator=((*this) + rhs); }
00108 SIM_DerVector3& operator+=(const UT_Vector3 &rhs)
00109 { return operator=((*this) + rhs); }
00110 SIM_DerVector3& operator-=(const SIM_DerVector3 &rhs)
00111 { return operator=((*this) - rhs); }
00112 SIM_DerVector3& operator-=(const UT_Vector3 &rhs)
00113 { return operator=((*this) - rhs); }
00114 SIM_DerVector3& operator*=(const SIM_DerScalar &rhs)
00115 { return operator=((*this) * rhs); }
00116 SIM_DerVector3& operator*=(const fpreal rhs)
00117 { return operator=((*this) * rhs); }
00118
00119 SIM_DerScalar dot(const SIM_DerVector3 &rhs) const;
00120 SIM_DerScalar dot(const UT_Vector3 &rhs) const;
00121 SIM_DerVector3 cross(const SIM_DerVector3 &rhs) const;
00122 SIM_DerVector3 cross(const UT_Vector3 &rhs) const;
00123 SIM_DerScalar length2() const;
00124 SIM_DerScalar length() const;
00125 SIM_DerVector3 normalize() const;
00126
00127
00128
00129
00130
00131 static UT_Matrix3 S(const UT_Vector3 &v)
00132 {
00133 return UT_Matrix3( 0, -v.z(), v.y(),
00134 v.z(), 0, -v.x(),
00135 -v.y(), v.x(), 0);
00136 }
00137
00138 private:
00139 UT_Vector3 myV;
00140 UT_Matrix3 myD;
00141 };
00142
00143 #include "SIM_DerScalar.h"
00144
00145 inline
00146 SIM_DerVector3 operator+(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs);
00147 inline
00148 SIM_DerVector3 operator-(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs);
00149 inline
00150 SIM_DerVector3 operator*(const SIM_DerScalar &s, const SIM_DerVector3 &v);
00151 inline
00152 SIM_DerVector3 operator*(fpreal s, const SIM_DerVector3 &v);
00153 inline
00154 SIM_DerVector3 operator/(const SIM_DerVector3 &v, const SIM_DerScalar &s);
00155 inline
00156 SIM_DerVector3 operator/(const SIM_DerVector3 &v, fpreal s);
00157 inline
00158 SIM_DerScalar dot(const SIM_DerVector3 &lhs, const SIM_DerVector3 &rhs);
00159 inline
00160 SIM_DerScalar dot(const SIM_DerVector3 &lhs, const UT_Vector3 &rhs);
00161 inline
00162 SIM_DerScalar dot(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs);
00163 inline
00164 SIM_DerVector3 cross(const SIM_DerVector3 &lhs, const SIM_DerVector3 &rhs);
00165 inline
00166 SIM_DerVector3 cross(const SIM_DerVector3 &lhs, const UT_Vector3 &rhs);
00167 inline
00168 SIM_DerVector3 cross(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs);
00169
00170
00171
00172 inline SIM_DerVector3
00173 SIM_DerVector3::operator*(const SIM_DerScalar &rhs) const
00174 {
00175
00176 UT_Matrix3 newD(D());
00177 newD *= rhs.v();
00178 newD.outerproductUpdate(1, v(), rhs.D());
00179
00180 return SIM_DerVector3(v() * rhs.v(), newD);
00181 }
00182
00183 inline SIM_DerScalar
00184 SIM_DerVector3::dot(const SIM_DerVector3 &rhs) const
00185 {
00186
00187
00188 return SIM_DerScalar(::dot(v(), rhs.v()),
00189 ::rowVecMult(rhs.v(), D()) +
00190 ::rowVecMult(v(), rhs.D()));
00191 }
00192
00193 inline SIM_DerScalar
00194 SIM_DerVector3::dot(const UT_Vector3 &rhs) const
00195 {
00196 return SIM_DerScalar(::dot(v(), rhs),
00197 ::rowVecMult(rhs, D()));
00198 }
00199
00200
00201
00202
00203 inline SIM_DerVector3
00204 SIM_DerVector3::cross(const SIM_DerVector3 &rhs) const
00205 {
00206 return SIM_DerVector3(::cross(v(), rhs.v()),
00207 S(-rhs.v()) * D() + S(v()) * rhs.D());
00208 }
00209
00210
00211
00212
00213 inline SIM_DerVector3
00214 SIM_DerVector3::cross(const UT_Vector3 &rhs) const
00215 {
00216 return SIM_DerVector3(::cross(v(), rhs), S(-rhs) * D());
00217 }
00218
00219
00220
00221 inline SIM_DerScalar
00222 SIM_DerVector3::length2() const
00223 {
00224 return SIM_DerScalar(v().length2(),
00225 2 * ::rowVecMult(v(), D()));
00226 }
00227
00228
00229
00230
00231
00232
00233
00234
00235 inline SIM_DerScalar
00236 SIM_DerVector3::length() const
00237 {
00238 const fpreal tol = 1e-5;
00239 const fpreal len = v().length();
00240 if( len < tol )
00241 return SIM_DerScalar(len);
00242 else
00243 return SIM_DerScalar(len, ::rowVecMult(v() / len, D()));
00244 }
00245
00246 inline SIM_DerVector3
00247 SIM_DerVector3::normalize() const
00248 {
00249
00250 return (*this)/length();
00251 }
00252
00253
00254
00255
00256
00257 inline SIM_DerVector3
00258 operator+(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs)
00259 {
00260 return rhs + lhs;
00261 }
00262
00263 inline SIM_DerVector3
00264 operator-(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs)
00265 {
00266 return SIM_DerVector3(lhs - rhs.v(), -rhs.D());
00267 }
00268
00269 inline SIM_DerVector3
00270 operator*(const SIM_DerScalar &s, const SIM_DerVector3 &v)
00271 {
00272 return v * s;
00273 }
00274
00275 inline SIM_DerVector3
00276 operator*(fpreal s, const SIM_DerVector3 &v)
00277 {
00278 return v * s;
00279 }
00280
00281 inline SIM_DerVector3
00282 operator/(const SIM_DerVector3 &v, const SIM_DerScalar &s)
00283 {
00284 return v * s.inverse();
00285 }
00286
00287 inline SIM_DerVector3
00288 operator/(const SIM_DerVector3 &v, fpreal s)
00289 {
00290 return v * (1/s);
00291 }
00292
00293 inline SIM_DerScalar
00294 dot(const SIM_DerVector3 &lhs, const SIM_DerVector3 &rhs)
00295 {
00296 return lhs.dot(rhs);
00297 }
00298
00299 inline SIM_DerScalar
00300 dot(const SIM_DerVector3 &lhs, const UT_Vector3 &rhs)
00301 {
00302 return lhs.dot(rhs);
00303 }
00304
00305 inline SIM_DerScalar
00306 dot(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs)
00307 {
00308 return rhs.dot(lhs);
00309 }
00310
00311 inline SIM_DerVector3
00312 cross(const SIM_DerVector3 &lhs, const SIM_DerVector3 &rhs)
00313 {
00314 return lhs.cross(rhs);
00315 }
00316
00317 inline SIM_DerVector3
00318 cross(const SIM_DerVector3 &lhs, const UT_Vector3 &rhs)
00319 {
00320 return lhs.cross(rhs);
00321 }
00322
00323 inline SIM_DerVector3
00324 cross(const UT_Vector3 &lhs, const SIM_DerVector3 &rhs)
00325 {
00326
00327
00328
00329 return SIM_DerVector3(::cross(lhs, rhs.v()),
00330 SIM_DerVector3::S(lhs) * rhs.D());
00331 }
00332 #endif