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