.[ ČeskéHry.cz ].

Laboratoř ČeskýchHer.cz - PasteBin

Vložit nový kód

ČeskéHry.cz - KOMUNITA HERNÍCH VÝVOJÁŘŮ

  1. bez titulku
    17 min
  2. 2025050411h49min45sec
    1 hod
  3. 2025050411h39min13sec
    1 hod
  4. 2025050411h28min09sec
    1 hod
  5. 2025050411h16min58sec
    2 hod
  6. 2025050411h06min27sec
    2 hod
  7. 2025050410h55min57sec
    2 hod
  8. 2025050410h45min28sec
    2 hod
  9. 2025050410h34min48sec
    2 hod
  10. 2025050410h24min12sec
    2 hod
Link: http://nopaste.ceske-hry.cz/subdom/nopaste479
Zaslal: nou
Popis: Trieda na prácu s maticami bodmi a vektormi.
Jazyk: C++
Vloženo: 12.9.2007, 14:14
Stáhnout jako soubor
  1. /////////////////////////////////////////
  2. //Matrix.h
  3. #ifndef _MATRIX_H_NOU_
  4. #define _MATRIX_H_NOU_
  5.  
  6. #include <string.h>
  7. #include <math.h>
  8. #include <windows.h>
  9. #include <gl/gl.h>
  10.  
  11. #ifndef RAD
  12. #define RAD (180/3.14159265358979323846)
  13. #endif
  14.  
  15. class Vector
  16. {
  17. private:
  18. float vector[3];
  19. public:
  20. Vector(){vector[0]=vector[1]=vector[2]=0;}
  21. float operator[](const int i)const{return vector[i];}
  22. void operator()(int i,float x){vector[i]=x;}
  23. void operator()(float *i){vector[0]=i[0];vector[1]=i[1];vector[2]=i[2];}
  24. void Set(float *i){vector[0]=i[0];vector[1]=i[1];vector[2]=i[2];}
  25. Vector operator+(const Vector &vec);//sucet dvoch vektorov
  26. Vector operator-(const Vector &vec);//rozdiel vektorov
  27. Vector operator*(const Vector &vec);//vektorovy sucin vektorov
  28. float Skalar(const Vector &vec);//skalarny sucin
  29. void Normalize();//znormalizuje vektor
  30. float UholR(Vector &vec);//vrati uhol v Radianoch
  31. float UholS(Vector &vec)//vrati uhol dvoch vektorov v stupnoch
  32. {
  33. return this->UholR(vec)*RAD;
  34. }
  35. float Velkost(){return sqrt(vector[0]*vector[0]+vector[1]*vector[1]+vector[2]*vector[2]);}
  36. };
  37.  
  38. class Bod
  39. {
  40. private:
  41. float bod[3];
  42. public:
  43. Bod(){bod[0]=bod[1]=bod[2]=0;}
  44. float operator[](int i)const{return bod[i];}
  45. void operator()(float *i){bod[0]=i[0];bod[1]=i[1];bod[2]=i[2];}
  46. void Set(float *i){bod[0]=i[0];bod[1]=i[1];bod[2]=i[2];}
  47. void operator()(int i, float x){if(i>=0 && i<=2)bod[i]=x;}
  48. Vector operator-(const Bod &bod2)//rozdiel dvoch bodov
  49. {
  50. Vector v;
  51. v(0 ,bod[0]-bod2[0]);
  52. v(1 ,bod[1]-bod2[1]);
  53. v(2 ,bod[2]-bod2[2]);
  54. return v;
  55. }
  56. float Delta(Bod &bod)//vzdialenost dvoch bodov
  57. {
  58. Vector rozdiel;
  59. rozdiel=*this-bod;
  60. return (float)sqrt(rozdiel[0]*rozdiel[0]+rozdiel[1]*rozdiel[1]+rozdiel[2]*rozdiel[2]);
  61. }
  62. };
  63.  
  64. class Matrix
  65. {
  66. private:
  67. float matica[16];
  68. public:
  69. Matrix();
  70. Matrix operator*(const Matrix &m2);//nasobenie matic
  71. Vector operator*(const Vector &vec);//nasobenie vectora a matice
  72. Bod operator*(const Bod &bod);//nasobenie bodu a matice
  73. Matrix& operator*=(Matrix &m2){*this=m2**this;return *this;}
  74. float operator[](int i)const{return matica[i];}
  75. void operator()(int i,float x){if(i>=0 && i<=15)matica[i]=x;}
  76. void Inverse();//zinvertizuje maticu
  77. float Determinant();//pocita determinant matice
  78. void Identity()//zmeni na jednotkovu maticu
  79. {
  80. memset(matica,0,sizeof(float)*16);
  81. matica[0]=matica[5]=matica[10]=matica[15]=1;
  82. }
  83. void operator()(float *m){memcpy(matica,m,sizeof(float)*16);}//nastavime z vektora hodnotu matice
  84. void Rotate(float x,float y,float z);//Eulerova rotacia
  85. void Translate(float x,float y,float z)
  86. {
  87. matica[12]=x; matica[13]=y; matica[14]=z;
  88. }
  89. void LoadGL(){glLoadMatrixf(matica);}//nacita maticu do OGL
  90. void GetGL(GLenum type=GL_MODELVIEW_MATRIX){glGetFloatv(type,matica);}
  91. void GetMatrix(float *mat){memcpy(mat,matica,sizeof(float)*16);}
  92. };
  93.  
  94.  
  95. #endif
  96.  
  97. /////////////////////////////////////////
  98. //Matrix.cpp
  99. #include "Matrix.h"
  100. #include <stdio.h>
  101.  
  102. Vector Vector::operator+(const Vector &vec)//sucet dvoch vektorov
  103. {
  104. Vector v;
  105. v(0, vec[0]+vector[0]);
  106. v(1, vec[1]+vector[1]);
  107. v(2, vec[2]+vector[2]);
  108. return v;
  109. }
  110.  
  111. Vector Vector::operator-(const Vector &vec)//rozdiel vektorov
  112. {
  113. Vector v;
  114. v(0, vector[0]-vec[0]);
  115. v(1, vector[1]-vec[1]);
  116. v(2, vector[2]-vec[2]);
  117. return v;
  118. }
  119.  
  120. Vector Vector::operator*(const Vector &vec)//vektorovy sucin vektorov
  121. {
  122. Vector v;
  123. v(0, vector[1]*vec[2]-vector[2]*vec[1]);
  124. v(1, vector[2]*vec[0]-vector[0]*vec[2]);
  125. v(2, vector[0]*vec[1]-vector[1]*vec[0]);
  126. return v;
  127. }
  128.  
  129. float Vector::Skalar(const Vector &vec)
  130. {
  131. return vector[0]*vec[0]+vector[1]*vec[1]+vector[2]*vec[2];
  132. }
  133.  
  134. void Vector::Normalize()//znormalizuje vektor
  135. {
  136. float d=(float)sqrt(vector[0]*vector[0]+vector[1]*vector[1]+vector[2]*vector[2]);
  137. vector[0]/=d;
  138. vector[1]/=d;
  139. vector[2]/=d;
  140. }
  141.  
  142. float Vector::UholR(Vector &vec)//vrati uhol v Radianoch
  143. {
  144. Vector u,v;
  145. u=*this;
  146. v=vec;
  147. u.Normalize();
  148. v.Normalize();
  149. return (float)acos(u.Skalar(v));
  150. }
  151.  
  152. Matrix::Matrix()
  153. {
  154. memset(matica,0,sizeof(float)*16);
  155. matica[0]=matica[5]=matica[10]=matica[15]=1;
  156. }
  157.  
  158. Matrix Matrix::operator*(const Matrix &m2)//nasobenie matic
  159. {
  160. Matrix mt;
  161. float *m1=matica;
  162. mt(0, m1[0]*m2[0]+m1[1]*m2[4]+m1[2]*m2[8]+m1[3]*m2[12]);
  163. mt(1, m1[0]*m2[1]+m1[1]*m2[5]+m1[2]*m2[9]+m1[3]*m2[13]);
  164. mt(2, m1[0]*m2[2]+m1[1]*m2[6]+m1[2]*m2[10]+m1[3]*m2[14]);
  165. mt(3, m1[0]*m2[3]+m1[1]*m2[7]+m1[2]*m2[11]+m1[3]*m2[15]);
  166.  
  167. mt(4, m1[4]*m2[0]+m1[5]*m2[4]+m1[6]*m2[8]+m1[7]*m2[12]);
  168. mt(5, m1[4]*m2[1]+m1[5]*m2[5]+m1[6]*m2[9]+m1[7]*m2[13]);
  169. mt(6, m1[4]*m2[2]+m1[5]*m2[6]+m1[6]*m2[10]+m1[7]*m2[14]);
  170. mt(7, m1[4]*m2[3]+m1[5]*m2[7]+m1[6]*m2[11]+m1[7]*m2[15]);
  171.  
  172. mt( 8, m1[8]*m2[0]+m1[9]*m2[4]+m1[10]*m2[8]+m1[11]*m2[12]);
  173. mt( 9, m1[8]*m2[1]+m1[9]*m2[5]+m1[10]*m2[9]+m1[11]*m2[13]);
  174. mt(10, m1[8]*m2[2]+m1[9]*m2[6]+m1[10]*m2[10]+m1[11]*m2[14]);
  175. mt(11, m1[8]*m2[3]+m1[9]*m2[7]+m1[10]*m2[11]+m1[11]*m2[15]);
  176.  
  177. mt(12, m1[12]*m2[0]+m1[13]*m2[4]+m1[14]*m2[8]+m1[15]*m2[12]);
  178. mt(13, m1[12]*m2[1]+m1[13]*m2[5]+m1[14]*m2[9]+m1[15]*m2[13]);
  179. mt(14, m1[12]*m2[2]+m1[13]*m2[6]+m1[14]*m2[10]+m1[15]*m2[14]);
  180. mt(15, m1[12]*m2[3]+m1[13]*m2[7]+m1[14]*m2[11]+m1[15]*m2[15]);
  181.  
  182. return mt;
  183. }
  184.  
  185. void Matrix::Inverse()//inverzna matica
  186. {
  187. float minor[16];
  188. float *m=matica;
  189. //vyratame minor zaroven cofaktor aj otocenie po uhlopriecke
  190. minor[ 0]=m[5]*m[10]*m[15]+m[6]*m[11]*m[13]+m[7]*m[9]*m[14]-m[7]*m[10]*m[13]-m[6]*m[9]*m[15]-m[5]*m[11]*m[14];
  191. minor[ 4]=-(m[4]*m[10]*m[15]+m[6]*m[11]*m[12]+m[7]*m[8]*m[14]-m[7]*m[10]*m[12]-m[6]*m[8]*m[15]-m[4]*m[11]*m[14]);
  192. minor[ 8]=m[4]*m[9]*m[15]+m[5]*m[11]*m[12]+m[7]*m[8]*m[13]-m[7]*m[9]*m[12]-m[5]*m[8]*m[15]-m[4]*m[11]*m[13];
  193. minor[12]=-(m[4]*m[9]*m[14]+m[5]*m[10]*m[12]+m[6]*m[8]*m[13]-m[6]*m[9]*m[12]-m[5]*m[8]*m[14]-m[4]*m[10]*m[13]);
  194.  
  195. minor[ 1]=-(m[1]*m[10]*m[15]+m[2]*m[11]*m[13]+m[3]*m[9]*m[14]-m[3]*m[10]*m[13]-m[2]*m[9]*m[15]-m[1]*m[11]*m[14]);
  196. minor[ 5]=m[0]*m[10]*m[15]+m[2]*m[11]*m[12]+m[3]*m[8]*m[14]-m[3]*m[10]*m[12]-m[2]*m[8]*m[15]-m[0]*m[11]*m[14];
  197. minor[ 9]=-(m[0]*m[9]*m[15]+m[1]*m[11]*m[12]+m[3]*m[8]*m[13]-m[3]*m[9]*m[12]-m[1]*m[8]*m[15]-m[0]*m[11]*m[13]);
  198. minor[13]=m[0]*m[9]*m[14]+m[1]*m[10]*m[12]+m[2]*m[8]*m[13]-m[2]*m[9]*m[12]-m[1]*m[8]*m[14]-m[0]*m[10]*m[13];
  199.  
  200. minor[ 2]=m[1]*m[6]*m[15]+m[2]*m[7]*m[13]+m[3]*m[5]*m[14]-m[3]*m[6]*m[13]-m[2]*m[5]*m[15]-m[1]*m[7]*m[14];
  201. minor[ 6]=-(m[0]*m[6]*m[15]+m[2]*m[7]*m[12]+m[3]*m[4]*m[14]-m[3]*m[6]*m[12]-m[2]*m[4]*m[15]-m[0]*m[7]*m[14]);
  202. minor[10]=m[0]*m[5]*m[15]+m[1]*m[7]*m[12]+m[3]*m[4]*m[13]-m[3]*m[5]*m[12]-m[1]*m[4]*m[15]-m[0]*m[7]*m[13];
  203. minor[14]=-(m[0]*m[5]*m[14]+m[1]*m[6]*m[12]+m[2]*m[4]*m[13]-m[2]*m[5]*m[12]-m[1]*m[4]*m[14]-m[0]*m[6]*m[13]);
  204.  
  205. minor[ 3]=-(m[1]*m[6]*m[11]+m[2]*m[7]*m[9]+m[3]*m[5]*m[10]-m[3]*m[6]*m[9]-m[2]*m[5]*m[11]-m[1]*m[7]*m[10]);
  206. minor[ 7]=m[0]*m[6]*m[11]+m[2]*m[7]*m[8]+m[3]*m[4]*m[10]-m[3]*m[6]*m[8]-m[2]*m[4]*m[11]-m[0]*m[7]*m[10];
  207. minor[11]=-(m[0]*m[5]*m[11]+m[1]*m[7]*m[8]+m[3]*m[4]*m[9]-m[3]*m[5]*m[8]-m[1]*m[4]*m[11]-m[0]*m[7]*m[9]);
  208. minor[15]=m[0]*m[5]*m[10]+m[1]*m[6]*m[8]+m[2]*m[4]*m[9]-m[2]*m[5]*m[8]-m[1]*m[4]*m[10]-m[0]*m[6]*m[9];
  209.  
  210. float det=Determinant();
  211. //vydelit adjoint / |A|
  212. if(det)//proti deleniu nulou
  213. {
  214. for(int i=0;i<16;i++)
  215. matica[i]=minor[i]/det;
  216. }
  217. }
  218.  
  219. float Matrix::Determinant()
  220. {
  221. //45 operacii najprv vyratame 2x2 determinanty
  222. float a1=matica[10]*matica[15]-matica[11]*matica[14];
  223. float a2=matica[ 9]*matica[15]-matica[11]*matica[13];
  224. float a3=matica[ 9]*matica[14]-matica[10]*matica[13];
  225. float a4=matica[ 7]*matica[ 2]-matica[ 6]*matica[ 3];
  226. float a5=matica[ 7]*matica[ 1]-matica[ 5]*matica[ 3];
  227. float a6=matica[ 6]*matica[ 1]-matica[ 5]*matica[ 2];
  228.  
  229. //vratime cely determinant
  230. return matica[ 0]*(matica[ 5]*a1-matica[ 6]*a2+matica[ 7]*a3)-
  231. matica[ 4]*(matica[ 1]*a1-matica[ 2]*a2+matica[ 3]*a3)+
  232. matica[ 8]*(matica[13]*a4-matica[14]*a5+matica[15]*a6)-
  233. matica[12]*(matica[ 9]*a4-matica[10]*a5+matica[11]*a6);
  234. }
  235.  
  236. Vector Matrix::operator*(const Vector &vec)//nasobenie vectora a matice
  237. {
  238. Vector v;
  239. v(0, vec[0] * matica[0] + vec[1] * matica[4] + vec[2] * matica[8]);
  240. v(1, vec[0] * matica[1] + vec[1] * matica[5] + vec[2] * matica[9]);
  241. v(2, vec[0] * matica[2] + vec[1] * matica[6] + vec[2] * matica[10]);
  242. return v;
  243. }
  244.  
  245. Bod Matrix::operator*(const Bod &bod)//nasobenie bodu a matice
  246. {
  247. Bod b;
  248. b(0, bod[0] * matica[0] + bod[1] * matica[4] + bod[2] * matica[8] + matica[12]);
  249. b(1, bod[0] * matica[1] + bod[1] * matica[5] + bod[2] * matica[9] + matica[13]);
  250. b(2, bod[0] * matica[2] + bod[1] * matica[6] + bod[2] * matica[10] + matica[14]);
  251. return b;
  252. }
  253.  
  254. void Matrix::Rotate(float x, float y, float z)// Hlavní funkce pro rotaci
  255. {
  256. glPushMatrix();
  257. glLoadMatrixf(matica);
  258. if(z)
  259. glRotatef(z*RAD,0,0,1);
  260. if(y)
  261. glRotatef(y*RAD,0,1,0);
  262. if(x)
  263. glRotatef(x*RAD,1,0,0);
  264. glGetFloatv(GL_MODELVIEW_MATRIX,matica);
  265. glPopMatrix();
  266. }
  267.