.[ ČeskéHry.cz ].

Laboratoř ČeskýchHer.cz - PasteBin

Vložit nový kód

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

  1. 2026110601h04min50sec
    2 min
  2. 2026110600h59min45sec
    7 min
  3. 2026110600h53min25sec
    14 min
  4. 2026110600h47min15sec
    20 min
  5. 2026110600h41min06sec
    26 min
  6. 2026110600h34min48sec
    32 min
  7. 2026110600h27min46sec
    39 min
  8. 2026110600h23min01sec
    44 min
  9. 2026110600h18min17sec
    49 min
  10. 2026110600h12min25sec
    55 min
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.