00001
00002
00004
00005 #if !defined(AFX_TMATRIX3D_H__A4C4DBBF_648D_4404_9191_25D98E20B62B__INCLUDED_)
00006 #define AFX_TMATRIX3D_H__A4C4DBBF_648D_4404_9191_25D98E20B62B__INCLUDED_
00007
00008 #if _MSC_VER > 1000
00009 #pragma once
00010 #endif // _MSC_VER > 1000
00011
00012
00013 #include <fcntl.h>
00014 #include <io.h>
00015 #include <stdlib.h>
00016 #include <windows.h>
00017 #include <gl/gl.h>
00018 #include <math.h>
00019
00020 #include "TKoo3d.h"
00021
00022 #define EINHEITSMATRIX(matr) matr[0][0]=1;matr[1][0]=0;matr[2][0]=0;matr[3][0]=0;\
00023 matr[0][1]=0;matr[1][1]=1;matr[2][1]=0;matr[3][1]=0;\
00024 matr[0][2]=0;matr[1][2]=0;matr[2][2]=1;matr[3][2]=0;\
00025 matr[0][3]=0;matr[1][3]=0;matr[2][3]=0;matr[3][3]=1;
00026
00027 #define NULLMATRIX(matr) matr[0][0]=0;matr[1][0]=0;matr[2][0]=0;matr[3][0]=0;\
00028 matr[0][1]=0;matr[1][1]=0;matr[2][1]=0;matr[3][1]=0;\
00029 matr[0][2]=0;matr[1][2]=0;matr[2][2]=0;matr[3][2]=0;\
00030 matr[0][3]=0;matr[1][3]=0;matr[2][3]=0;matr[3][3]=0;
00031
00032 template <class T> class TMatrix3D
00033 {
00034
00035
00036 public:
00037 T v[4] [4];
00038
00039
00040
00041
00042 double determinante ()
00043 {
00044 double buff1=0;
00045 double buff2=1;
00046 int feldnum;
00047
00048 int i;
00049
00050 for (i=0;i<=2;i++)
00051 {
00052 buff2=1;
00053 for (int j=0;j<=2;j++)
00054 {
00055 feldnum=j+i;
00056 if (feldnum>2) feldnum-=3;
00057 buff2*=v[feldnum][j];
00058 }
00059 buff1+=buff2;
00060 }
00061
00062 for (i=0;i<=2;i++)
00063 {
00064 buff2=1;
00065 for (int j=2;j>=0;j--)
00066 {
00067 feldnum=(2-j)+i;
00068 if (feldnum>2) feldnum-=3;
00069 buff2*=v[feldnum][j];
00070 }
00071 buff1-=buff2;
00072 }
00073 return (buff1);
00074 }
00075
00076 TMatrix3D<T> operator* (TMatrix3D<T>& m)
00077 {
00078 TMatrix3D<T> matrixbuff;
00079 float vbuff;
00080
00081 for (int x=0; x<=3; x++)
00082 for (int y=0; y<=3; y++)
00083 {
00084 vbuff=0;
00085 for (int i=0; i<=3; i++)
00086 vbuff=(float)(vbuff+v[x][i]*m.v[i][y]);
00087 matrixbuff.v[x][y]=vbuff;
00088 }
00089
00090 return matrixbuff;
00091 }
00092
00093
00094
00095
00096
00097
00098
00099 static TMatrix3D<T> interpolate(TMatrix3D<T>* m[],float f[], int count)
00100 {
00101
00102
00103
00104
00105 TMatrix3D<T> mBuff(NULL);
00106 float max=0.0;
00107 for (int l=0;l<=count;l++)
00108 max+=f[l];
00109 int i,j;
00110 for (int k=0;k<=count;k++)
00111 {
00112 if (f[k]!=0.0f)
00113 {
00114 for (i=0;i<4;i++)
00115 {
00116 for (j=0;j<4;j++)
00117 {
00118
00119 mBuff.v[i][j]+=f[k]*m[k]->v[i][j];
00120 }
00121
00122
00123 }
00124 }
00125
00126 }
00127 for (i=0;i<4;i++)
00128 {
00129 for (j=0;j<4;j++)
00130 {
00131
00132 mBuff.v[i][j]/=max;
00133 }
00134
00135
00136 }
00137
00138 return mBuff;
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 };
00152
00153
00154
00155
00156
00157 template <class A> TKoo3d<A> operator* (TKoo3d<A>& k)
00158 {
00159 TKoo3d<A> koobuff;
00160
00161 koobuff.v[0]=(A)(v[0][0]*k.v[0]+v[1][0]*k.v[1]+v[2][0]*k.v[2]+v[3][0]);
00162 koobuff.v[1]=(A)(v[0][1]*k.v[0]+v[1][1]*k.v[1]+v[2][1]*k.v[2]+v[3][1]);
00163 koobuff.v[2]=(A)(v[0][2]*k.v[0]+v[1][2]*k.v[1]+v[2][2]*k.v[2]+v[3][2]);
00164
00165
00166 return koobuff;
00167 }
00168
00169
00170
00171 virtual ~TMatrix3D()
00172 {
00173 };
00174 TMatrix3D<T> getNormalized()
00175 {
00176 TMatrix3D<T> mBuff=*this;
00177 mBuff.normalize();
00178 return mBuff;
00179 }
00180 void normalize()
00181 {
00182 double fBuff;
00183 for (int k=0;k<3;k++)
00184 {
00185
00186 fBuff=sqrt(v[k][0]*v[k][0]+v[k][1]*v[k][1]+v[k][2]*v[k][2]);
00187 v[k][0]=(T)(v[k][0]/fBuff);
00188 v[k][1]=(T)(v[k][1]/fBuff);
00189 v[k][2]=(T)(v[k][2]/fBuff);
00190
00191 }
00192 };
00193 TMatrix3D<T> operator+ (TMatrix3D<T>& m)
00194 {
00195 TMatrix3D<T> mBuff(NULL);
00196 for (int i=0;i<4;i++)
00197 for (int j=0;j<4;j++)
00198 mBuff.v[i][j]=v[i][j]+m.v[i][j];
00199
00200 return mBuff;
00201
00202 }
00203 TMatrix3D<T> getRotFract()
00204 {
00205 TMatrix3D<T> mBuff;
00206 for (int i=0;i<3;i++)
00207 for (int j=0;j<3;j++)
00208 mBuff.v[i][j]=v[i][j];
00209 return mBuff;
00210
00211 }
00212 TKoo3d<T> getTransFract()
00213 {
00214 return TKoo3d<T> (v[3][0],v[3][1],v[3][2]);
00215 }
00216 void setRotFract(TMatrix3D<T>& m)
00217 {
00218
00219 for (int i=0;i<3;i++)
00220 for (int j=0;j<3;j++)
00221 v[i][j]=m.v[i][j];
00222
00223
00224 }
00225 void setTransFract(TKoo3d<T>& t)
00226 {
00227 for (int i=0;i<3;i++)
00228 v[3][i]=t.v[i];
00229 }
00230 TMatrix3D<T> operator- (TMatrix3D<T>& m)
00231 {
00232 TMatrix3D<T> mBuff(NULL);
00233 for (int i=0;i<4;i++)
00234 for (int j=0;j<4;j++)
00235 mBuff.v[i][j]=v[i][j]-m.v[i][j];
00236
00237 return mBuff;
00238
00239 }
00240 TMatrix3D<T> operator* (float f)
00241 {
00242 TMatrix3D<T> mBuff(NULL);
00243 for (int i=0;i<4;i++)
00244 for (int j=0;j<4;j++)
00245 mBuff.v[i][j]=v[i][j]*f;
00246
00247 return mBuff;
00248
00249 }
00250 TMatrix3D()
00251 {
00252
00253
00254
00255
00256
00257
00258
00259 EINHEITSMATRIX(v);
00260 }
00261 TMatrix3D(float mat[][4])
00262 {
00263 if (mat)
00264 memcpy(v,mat,sizeof(GLfloat)*16);
00265 else
00266 NULLMATRIX(v);
00267
00268 }
00269 void oneDivV()
00270 {
00271 for (int i=0;i<=3;i++)
00272 for (int j=0;j<=3;j++)
00273 v[i][j]=(v[i][j])?1/v[i][j]:0;
00274 }
00275 TMatrix3D fastInvert();
00276
00277 void addLinCombRow(T* row, int ind, T linFakt)
00278 {
00279 v[0][ind]=v[0][ind]+row[0]*linFakt;
00280 v[1][ind]=v[1][ind]+row[1]*linFakt;
00281 v[2][ind]=v[2][ind]+row[2]*linFakt;
00282 v[3][ind]=v[3][ind]+row[3]*linFakt;
00283 }
00284
00285 TMatrix3D invert()
00286 {
00287 int i;
00288 int j;
00289 T rowBuff[4];
00290 TMatrix3D<T> mBuff;
00291
00292 for (j=0;j<3;j++)
00293 {
00294 rowBuff[0]=v[0][j];
00295 rowBuff[1]=v[1][j];
00296 rowBuff[2]=v[2][j];
00297 rowBuff[3]=v[3][j];
00298 for (i=j+1;i<4;i++)
00299 {
00300
00301
00302 addLinCombRow(rowBuff,i, -v[j][i]/v[j][j]);
00303 mBuff.addLinCombRow(rowBuff,i, -v[j][i]/v[j][j]);
00304 }
00305 }
00306
00307 for (j=3;j>0;j--)
00308 {
00309 rowBuff[0]=v[0][j];
00310 rowBuff[1]=v[1][j];
00311 rowBuff[2]=v[2][j];
00312 rowBuff[3]=v[3][j];
00313 for (i=j-1;i>=0;i--)
00314 {
00315
00316
00317 addLinCombRow(rowBuff,i, -v[j][i]/v[j][j]);
00318 mBuff.addLinCombRow(rowBuff,i, -v[j][i]/v[j][j]);
00319 }
00320 }
00321
00322 for (j=0;j<4;j++)
00323 for (i=0;i<4;i++)
00324 mBuff.v[i][j]/=v[j][j];
00325
00326 return mBuff;
00327 }
00328
00329 };
00330
00331 template <class T> class TTransMatrix : public TMatrix3D<T>
00332 {
00333 public:
00334 TTransMatrix(GLfloat x,GLfloat y,GLfloat z)
00335 {
00336 v[3][0]=x;
00337 v[3][1]=y;
00338 v[3][2]=z;
00339
00340 }
00341 virtual ~TTransMatrix()
00342 {
00343 };
00344 };
00345
00346 template <class T> class TRollMatrix : public TMatrix3D<T>
00347 {
00348 public:
00349 TRollMatrix()
00350 {
00351 v[0][0]=0;
00352 v[1][0]=1;
00353 v[0][1]=1;
00354 v[1][1]=0;
00355
00356 }
00357 virtual ~TRollMatrix()
00358 {
00359 };
00360 };
00361
00362 template <class T> class TRotMatrixZ : public TMatrix3D<T>
00363 {
00364 public:
00365 TRotMatrixZ(double w)
00366 {
00367 v[0][0]=(T)cos(w);v[1][0]=(T)-sin(w);
00368 v[0][1]=(T)sin(w);v[1][1]=(T)cos(w);
00369 };
00370 virtual ~TRotMatrixZ()
00371 {
00372 };
00373
00374 };
00375 template <class T> class TRotMatrixX : public TMatrix3D<T>
00376 {
00377 public:
00378 TRotMatrixX(double w)
00379 {
00380 v[1][1]=(T)cos(w);v[2][1]=(T)-sin(w);
00381 v[1][2]=(T)sin(w);v[2][2]=(T)cos(w);
00382 };
00383 virtual ~TRotMatrixX()
00384 {
00385 };
00386
00387 };
00388 template <class T> class TRotMatrixY : public TMatrix3D<T>
00389 {
00390 public:
00391 TRotMatrixY(double w)
00392 {
00393 v[0][0]=(T)cos(w);v[2][0]=(T)-sin(w);
00394 v[0][2]=(T)sin(w);v[2][2]=(T)cos(w);
00395 };
00396 virtual ~TRotMatrixY()
00397 {
00398 };
00399
00400 };
00401 template <class T> class TRotMatrix : public TMatrix3D<T>
00402 {
00403 public:
00404 template <class A> TRotMatrix(TKoo3d<A>& achse, float angle)
00405 {
00406 TKoo3d<A> uz=achse.normalize();
00407 TKoo3d<A> uy=(uz*TKoo3d<GLfloat>(1.0,0.0,0.0)).normalize();
00408 if (uy==TKoo3d<A>(0.0,0.0,0.0))
00409 uy=(uz*TKoo3d<A>(1.0,1.0,0.0)).normalize();
00410
00411 TKoo3d<A> ux=(uy*uz).normalize();
00412
00413 TMatrix3D<T> mBuff;
00414 for (int i=0;i<3;i++)
00415 {
00416 mBuff.v[i][0]=ux.v[i];
00417 mBuff.v[i][1]=uy.v[i];
00418 mBuff.v[i][2]=uz.v[i];
00419
00420 }
00421
00422
00423 mBuff=mBuff.fastInvert()*TRotMatrixZ<T>(angle)*mBuff;
00424 memcpy(v,mBuff.v,sizeof(T)*16);
00425
00426 };
00427
00428 virtual ~TRotMatrix()
00429 {
00430 };
00431
00432 };
00433
00434
00435
00436 template <class T> TMatrix3D<T> TMatrix3D<T>::fastInvert()
00437 {
00438 TMatrix3D<T> mBuff;
00439
00440 for (int i=0;i<3;i++)
00441 {
00442
00443 for (int j=0;j<3;j++)
00444 mBuff.v[i][j]=v[j][i];
00445
00446 }
00447 mBuff=TTransMatrix<T>(-v[3][0],-v[3][1],-v[3][2])*mBuff;
00448 return mBuff;
00449 }
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504 #endif // !defined(AFX_TMATRIX3D_H__A4C4DBBF_648D_4404_9191_25D98E20B62B__INCLUDED_)