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
00061
00062
00063
00064
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
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 virtual bool equals(const GVector& gvector) {
00142
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
00152
00153
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
00168
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
00317
00318
00319
00320
00321
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