GVector.h

Go to the documentation of this file.
00001 #ifndef __VECMATH_GVECTOR_HPP
00002 #define __VECMATH_GVECTOR_HPP
00003 
00004 #include <vecmath/Tuple2f.h>
00005 #include <vecmath/Tuple3d.h>
00006 #include <vecmath/Tuple3f.h>
00007 #include <vecmath/Tuple4d.h>
00008 #include <vecmath/Tuple4f.h>
00009 
00010 class GMatrix;
00011 
00012 class VECMATH_EXPORT GVector {
00013     int length;
00014 public:
00015     double *values;
00016 
00017     explicit GVector(int i) {
00018         length = i;
00019         values = new double[i];
00020         zero();
00021     }
00022 
00023     GVector(const GVector& gvector) {
00024         values = new double[gvector.length];
00025         length = gvector.length;
00026         for(int i = 0; i < length; i++)
00027             values[i] = gvector.values[i];
00028     }
00029 
00030     GVector(const Tuple2f& tuple2f) {
00031         length = 2;
00032         values = new double[length];
00033         tuple2f.get(values);
00034     }
00035 
00036     GVector(const Tuple3d& tuple3d) {
00037         length = 3;
00038         values = new double[length];
00039         tuple3d.get(values);
00040     }
00041 
00042     GVector(const Tuple3f& tuple3f) {
00043         length = 3;
00044         values = new double[length];
00045         tuple3f.get(values);
00046     }
00047 
00048     GVector(const Tuple4d& tuple4d) {
00049         length = 4;
00050         values = new double[length];
00051         tuple4d.get(values);
00052     }
00053 
00054     GVector(const Tuple4f& tuple4f) {
00055         length = 4;
00056         values = new double[length];
00057         tuple4f.get(values);
00058     }
00059 
00060 //      GVector(const double ad[]) {
00061 //          length = ad.length;
00062 //          values = new double[ad.length];
00063 //          for(int i = 0; i < length; i++)
00064 //              values[i] = ad[i];
00065 //
00066 //      }
00067 
00068     GVector(const double ad[], int i) {
00069         length = i;
00070         values = new double[i];
00071         for(int j = 0; j < i; j++)
00072             values[j] = ad[j];
00073     }
00074 
00075     virtual ~GVector() {
00076         delete [] values;
00077     }
00078 
00079     void LUDBackSolve(GMatrix& gmatrix, GVector& gvector, GVector& gvector1);
00080 
00081     void SVDBackSolve(GMatrix& gmatrix, GMatrix& gmatrix1, GMatrix& gmatrix2, GVector& gvector);
00082 
00083     void add(const GVector& gvector) {
00084         for (int i = 0; i < length; i++)
00085             values[i] += gvector.values[i];
00086     }
00087 
00088     void add(const GVector& gvector, const GVector& gvector1) {
00089         for(int i = 0; i < length; i++)
00090             values[i] = gvector.values[i] + gvector1.values[i];
00091     }
00092 
00093     double angle(const GVector& gvector) const {
00094         return acos(dot(gvector) / (norm() * gvector.norm()));
00095     }
00096 
00097     double dot(const GVector& gvector) const {
00098         double d = 0.0;
00099         for (int i = 0; i < length; i++)
00100             d += values[i] * gvector.values[i];
00101 
00102         return d;
00103     }
00104 
00105     virtual bool epsilonEquals(GVector gvector, double d) const {
00106         if (length != gvector.length)
00107             return false;
00108 
00109         for (int i = 0; i < length; i++) {
00110             double d1 = values[i] - gvector.values[i];
00111             if ((d1 >= 0.0 ? d1 : -d1) > d)
00112                 return false;
00113         }
00114 
00115         return true;
00116     }
00117 
00118 //      virtual bool equals(Object obj)
00119 //      {
00120 //          try
00121 //          {
00122 //              GVector gvector = (GVector)obj;
00123 //              if(length != gvector.length)
00124 //                  return false;
00125 //              for(int i = 0; i < length; i++)
00126 //                  if(values[i] != gvector.values[i])
00127 //                      return false;
00128 //
00129 //              return true;
00130 //          }
00131 //          catch(ClassCastException _ex)
00132 //          {
00133 //              return false;
00134 //          }
00135 //          catch(NullPointerException _ex)
00136 //          {
00137 //              return false;
00138 //          }
00139 //      }
00140 
00141     virtual bool equals(const GVector& gvector) {
00142 //          try {
00143             if(length != gvector.length)
00144                 return false;
00145             for(int i = 0; i < length; i++)
00146                 if(values[i] != gvector.values[i])
00147                     return false;
00148 
00149             return true;
00150 //          }
00151 //          catch(NullPointerException _ex)
00152 //          {
00153 //              return false;
00154 //          }
00155     }
00156 
00157     double getElement(int i) const {
00158         return values[i];
00159     }
00160 
00161     int getSize() const {
00162         return length;
00163     }
00164 
00165     int hashCode() const {
00166         int i = 0;
00167 //          for(int j = 0; j < length; j++)
00168 //              i ^= (new Double(values[j])).hashCode();
00169 //
00170         return i;
00171     }
00172 
00173     void interpolate(const GVector& gvector, double d) {
00174         for (int i = 0; i < length; i++)
00175             values[i] = (1.0 - d) * values[i] + d * gvector.values[i];
00176     }
00177 
00178     void interpolate(const GVector& gvector, const GVector& gvector1, double d) {
00179         for (int i = 0; i < length; i++)
00180             values[i] = (1.0 - d) * gvector.values[i] + d * gvector1.values[i];
00181 
00182     }
00183 
00184     void mul(const GMatrix& gmatrix, const GVector& gvector);
00185     void mul(const GVector& gvector, const GMatrix& gmatrix);
00186 
00187     void negate() {
00188         for(int i = 0; i < length; i++)
00189             values[i] *= -1;
00190     }
00191 
00192     double norm() const {
00193         return sqrt(normSquared());
00194     }
00195 
00196     double normSquared() const {
00197         double d = 0.0;
00198 
00199         for (int i = 0; i < length; i++)
00200             d += values[i] * values[i];
00201 
00202         return d;
00203     }
00204 
00205     void normalize() {
00206         double d = normSquared();
00207 
00208         for(int i = 0; i < length; i++)
00209             values[i] /= d;
00210     }
00211 
00212     void normalize(const GVector& gvector) {
00213         double d = gvector.normSquared();
00214 
00215         for (int i = 0; i < length; i++)
00216             values[i] = gvector.values[i] / d;
00217     }
00218 
00219     void scale(double d) {
00220         scale(d, *this);
00221     }
00222 
00223     void scale(double d, const GVector& gvector) {
00224         for (int i = 0; i < length; i++)
00225             values[i] = gvector.values[i] * d;
00226     }
00227 
00228     void scaleAdd(double d, const GVector& gvector, const GVector& gvector1)  {
00229         for (int i = 0; i < length; i++)
00230             values[i] = gvector.values[i] * d + gvector1.values[i];
00231     }
00232 
00233     void set(const GVector& gvector) {
00234         if (length < gvector.length) {
00235             resize(gvector.length);
00236             for (int i = 0; i < length; i++)
00237                 values[i] = gvector.values[i];
00238         } else {
00239             for (int i = 0; i < gvector.length; i++)
00240                 values[i] = gvector.values[i];
00241             zero(gvector.length);
00242         }
00243     }
00244 
00245     void set(const Tuple2f& tuple2f) {
00246         if (length < 2)
00247             resize(2);
00248 
00249         tuple2f.get(values);
00250         zero(2);
00251     }
00252 
00253     void set(const Tuple3d& tuple3d) {
00254         if (length < 3)
00255             resize(3);
00256 
00257         tuple3d.get(values);
00258         zero(3);
00259     }
00260 
00261     void set(const Tuple3f& tuple3f) {
00262         if (length < 3)
00263             resize(3);
00264 
00265         tuple3f.get(values);
00266         zero(3);
00267     }
00268 
00269     void set(const Tuple4d& tuple4d) {
00270         if (length < 4)
00271             resize(4);
00272 
00273         tuple4d.get(values);
00274         zero(4);
00275     }
00276 
00277     void set(const Tuple4f& tuple4f) {
00278         if (length < 4)
00279             resize(4);
00280 
00281         tuple4f.get(values);
00282         zero(4);
00283     }
00284 
00285     void set(const double ad[]) {
00286         for (int i = 0; i < length; i++)
00287             values[i] = ad[i];
00288     }
00289 
00290     void setElement(int i, double d) {
00291         values[i] = d;
00292     }
00293 
00294     void setSize(int i) {
00295         int k = (length < i) ? length : i;
00296         double *ad = new double[i];
00297 
00298         for (int j = 0; j < k; j++)
00299             ad[j] = values[j];
00300 
00301         length = i;
00302         delete [] values;
00303         values = ad;
00304     }
00305 
00306     void sub(const GVector& gvector) {
00307         for (int i = 0; i < length; i++)
00308             values[i] -= gvector.values[i];
00309     }
00310 
00311     void sub(GVector gvector, GVector gvector1) {
00312         for (int i = 0; i < length; i++)
00313             values[i] = gvector.values[i] - gvector1.values[i];
00314     }
00315 
00316 //      String& toString() {
00317 //          StringBuffer stringbuffer = new StringBuffer(length * 8);
00318 //          for(int i = 0; i < length; i++)
00319 //              stringbuffer.append(values[i]).append(" ");
00320 //
00321 //          return stringbuffer.toString();
00322 //      }
00323 
00324     void zero(int from = 0) {
00325         for (int i = from; i < length; i++)
00326             values[i] = 0.0;
00327     }
00328 
00329 private:
00330     double* resize(int i) {
00331         if (length > 0 && values != 0) {
00332             delete [] values;
00333         }
00334 
00335         values = new double[i];
00336         length = i;
00337 
00338         return values;
00339     }
00340 
00341 };
00342 
00343 #endif

Generated on Thu Sep 29 13:39:44 2005 for vecmath by  doxygen 1.4.4