00001 #ifndef __J2K__JVector3D_CPP__
00002 #define __J2K__JVector3D_CPP__
00003
00004 #include <j2k/Fred/Math/Vector/Vector3D.hpp>
00005
00006 void JVector3D::Mix( const JVector3D& v ) {
00007 X *= v.Y;
00008 X *= v.Z;
00009 Y *= v.Z;
00010 }
00011
00012 JVector3D::JVector3D()
00013 : X(0.0), Y(0.0), Z(0.0) { }
00014
00015 JVector3D::JVector3D( const double x, const double y, const double z )
00016 : X( x ), Y( y ), Z( z ) { }
00017
00018 JVector3D::JVector3D( const JVector3D& v )
00019 : X( v.X ), Y( v.Y ), Z( v.Z ) { }
00020
00021 BOOL JVector3D::Compare( const JVector3D& v ) const {
00022 if (v.X != X) return FALSE;
00023 if (v.Y != Y) return FALSE;
00024 if (v.Z != Z) return FALSE;
00025
00026 return TRUE;
00027 }
00028
00029 inline BOOL JVector3D::operator==( const JVector3D& v ) const {
00030 return Compare( v );
00031 }
00032
00033 inline BOOL JVector3D::operator!=( const JVector3D& v ) const {
00034 return !Compare( v );
00035 }
00036
00037 JVector3D operator+( const JVector3D& v1, const JVector3D& v2 ) {
00038 return JVector3D( v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z );
00039 }
00040
00041 JVector3D operator-( const JVector3D& v1, const JVector3D& v2 ) {
00042 return JVector3D( v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z );
00043 }
00044
00045 JVector3D operator*( const JVector3D& v1, const JVector3D& v2 ) {
00046 return JVector3D( v1.X * v2.X, v1.Y * v2.Y, v1.Z * v2.Z );
00047 }
00048
00049 JVector3D operator/( const JVector3D& v1, const JVector3D& v2 ) {
00050 return JVector3D( v1.X / v2.X, v1.Y / v2.Y, v1.Z / v2.Z );
00051 }
00052
00053 JVector3D operator+( const JVector3D& v, const double r ) {
00054 return JVector3D( v.X + r, v.Y + r, v.Z + r );
00055 }
00056
00057 JVector3D operator-( const JVector3D& v, const double r ) {
00058 return JVector3D( v.X - r, v.Y - r, v.Z - r );
00059 }
00060
00061 JVector3D operator*( const JVector3D& v, const double r ) {
00062 return JVector3D( v.X * r, v.Y * r, v.Z * r );
00063 }
00064
00065 JVector3D operator/( const JVector3D& v, const double r ) {
00066 return JVector3D( v.X / r, v.Y / r, v.Z / r );
00067 }
00068
00069 void JVector3D::operator+=( const JVector3D& v ) {
00070 X += v.X;
00071 Y += v.Y;
00072 Z += v.Z;
00073 }
00074
00075 void JVector3D::operator-=( const JVector3D& v ) {
00076 X -= v.X;
00077 Y -= v.Y;
00078 Z -= v.Z;
00079 }
00080
00081 void JVector3D::operator*=( const JVector3D& v ) {
00082 X *= v.X;
00083 Y *= v.Y;
00084 Z *= v.Z;
00085 }
00086
00087 void JVector3D::operator/=( const JVector3D& v ) {
00088 X /= v.X;
00089 Y /= v.Y;
00090 Z /= v.Z;
00091 }
00092
00093 void JVector3D::operator+=( const double r ) {
00094 X += r;
00095 Y += r;
00096 Z += r;
00097 }
00098
00099 void JVector3D::operator-=( const double r ) {
00100 X -= r;
00101 Y -= r;
00102 Z -= r;
00103 }
00104
00105 void JVector3D::operator*=( const double r ) {
00106 X *= r;
00107 Y *= r;
00108 Z *= r;
00109 }
00110
00111 void JVector3D::operator/=( const double r ) {
00112 if ( r == 0 ) return;
00113 X /= r;
00114 Y /= r;
00115 Z /= r;
00116 }
00117
00118 inline void JVector3D::Abs() {
00119 X = abs(X);
00120 Y = abs(Y);
00121 Z = abs(Z);
00122 }
00123
00124 inline BOOL JVector3D::bAtOrg() const {
00125 return ( (X == 0.0) && (Y == 0.0) && (Z == 0.0) );
00126 }
00127
00128 BOOL JVector3D::bWithinLimits( const double r ) const {
00129 return !( (X > r) || (Y > r) || (Z > r)
00130 || (X < -r) || (Y < -r) || (Z < -r) );
00131 }
00132
00133 inline double JVector3D::Dot( const JVector3D& v ) const {
00134 return (X * v.X) + (Y * v.Y) + (Z * v.Z);
00135 }
00136
00137 inline double JVector3D::Magnitude() const {
00138 return sqrt( (X * X) + (Y * Y) + (Z * Z) );
00139 }
00140
00141 void JVector3D::ClipToDegrees() {
00142 if (X > 360.0)
00143 X = mod(X, 360.0);
00144
00145 if (Y > 360.0)
00146 Y = mod(Y, 360.0);
00147
00148 if (Z > 360.0)
00149 Z = mod(Z, 360.0);
00150 }
00151
00152 void JVector3D::Normalize() {
00153 double Mag = Magnitude();
00154
00155 if ( Mag != 0 ) {
00156 X /= Mag;
00157 Y /= Mag;
00158 Z /= Mag;
00159 }
00160 }
00161
00162 void JVector3D::ToRadians()
00163 {
00164 if (abs(X) > 360.0)
00165 X = mod(X, 360.0);
00166
00167 if (abs(Y) > 360.0)
00168 Y = mod(Y, 360.0);
00169
00170 if (abs(Z) > 360.0)
00171 Z = mod(Z, 360.0);
00172
00173 X *= MATH_PI / 180.0;
00174 Y *= MATH_PI / 180.0;
00175 Z *= MATH_PI / 180.0;
00176 }
00177
00178
00179 void JVector3D::Cross( const JVector3D& v ) {
00180 const double xTmp = (Y * v.Z) - (Z * v.Y);
00181 const double yTmp = (Z * v.X) - (X * v.Z);
00182 const double zTmp = (X * v.Y) - (Y * v.X);
00183 X = xTmp;
00184 Y = yTmp;
00185 Z = zTmp;
00186 }
00187
00188 void JVector3D::HalfBetween( const JVector3D& v ) {
00189 X = 0.5 * (X + v.X);
00190 Y = 0.5 * (Y + v.Y);
00191 Z = 0.5 * (Z + v.Z);
00192 }
00193
00194 JVector3D vecCross( const JVector3D& v1, const JVector3D& v2 ) {
00195 return JVector3D( (v1.Y * v2.Z) - (v1.Z * v2.Y),
00196 (v1.Z * v2.X) - (v1.X * v2.Z),
00197 (v1.X * v2.Y) - (v1.Y * v2.X)
00198 );
00199 }
00200
00201 inline JVector3D& JVector3D::operator=( const JVector3D& v ) {
00202 X = v.X;
00203 Y = v.Y:
00204 Z = v.Z;
00205 return *this;
00206 }
00207
00208 inline void JVector3D::AddScaled( const JVector3D& v, const double Scale ) {
00209 X += v.X * Scale;
00210 Y += v.Y * Scale;
00211 Z += v.Z * Scale;
00212 }
00213
00214 inline void JVector3D::Adjust( const double x, const double y, const double z )
00215 {
00216 X += x;
00217 Y += y;
00218 Z += z;
00219 }
00220
00221 inline double JVector3D::X() const {
00222 return X;
00223 }
00224
00225 inline double JVector3D::X( const double x ) {
00226 X = x;
00227 return X;
00228 }
00229
00230 inline double JVector3D::Y() const {
00231 return Y;
00232 }
00233
00234 inline double JVector3D::Y( const double y ) {
00235 Y = y;
00236 return Y;
00237 }
00238 inline double JVector3D::Z() const {
00239 return Z;
00240 }
00241
00242 inline double JVector3D::Z( const double z ) {
00243 Z = z;
00244 return Z;
00245 }
00246
00247 inline double JVector3D::MagSum() const {
00248 return (X + Y + Z);
00249 }
00250
00251 inline void JVector3D::Negate() {
00252 X *= -1;
00253 Y *= -1;
00254 Z *= -1;
00255 }
00256
00257 inline void JVector3D::Set( const double x, const double y, const double z ) {
00258 X = x;
00259 Y = y;
00260 Z = z;
00261 }
00262
00263 inline void JVector3D::Square() {
00264 X *= X;
00265 Y *= Y;
00266 Z *= Z;
00267 }
00268
00269 inline JVector3D vecHalfBetween( const JVector3D& v1, const JVector3D& v2 ) {
00270 return JVector3D( 0.5 * (v1.X + v2.X),
00271 0.5 * (v1.Y + v2.Y),
00272 0.5 * (v1.Z + v2.Z)
00273 );
00274 }
00275
00276 inline JVector3D vecMix( const JVector3D& v1, const JVector3D& v2 ) {
00277 return JVector3D( v1.X * v2.Y, v1.X * v2.Z, v1.Y * v2.Z );
00278 }
00279
00280
00281
00282
00283
00284 typedef JVector3D T3DPoint;
00285
00286 #endif