Advertisement
Guest User

Untitled

a guest
Nov 30th, 2009
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.19 KB | None | 0 0
  1. #include "Transform.h"
  2. #include <assert.h>
  3. #include <math.h>
  4.  
  5. CTransform::CTransform(){
  6.     matrix = new double[16];
  7.     LoadIdentity();
  8. }
  9.  
  10. CTransform& CTransform::Transform(Vertex3d v){
  11.     matrix[12] = v.x;
  12.     matrix[13] = v.y;
  13.     matrix[14] = v.z;
  14.     return (*this);
  15. }
  16.  
  17. CTransform& CTransform::Translate(Vertex3d v){
  18.     matrix[12] += v.x;
  19.     matrix[13] += v.y;
  20.     matrix[14] += v.z;
  21.     return (*this);
  22. }
  23.  
  24. CTransform& CTransform::Scale(Vertex3d v){
  25.     matrix[0] *= v.x;
  26.     matrix[5] *= v.y;
  27.     matrix[10] *= v.z;
  28.     return (*this);
  29. }
  30.  
  31. CTransform& CTransform::LoadIdentity(){
  32.    
  33.     matrix[0] = 1;
  34.     matrix[1] = 0;
  35.     matrix[2] = 0;
  36.     matrix[3] = 0;
  37.     matrix[4] = 0;
  38.     matrix[5] = 1;
  39.     matrix[6] = 0;
  40.     matrix[7] = 0;
  41.     matrix[8] = 0;
  42.     matrix[9] = 0;
  43.     matrix[10] = 1;
  44.     matrix[11] = 0;
  45.     matrix[12] = 0;
  46.     matrix[13] = 0;
  47.     matrix[14] = 0;
  48.     matrix[15] = 1;
  49.     return (*this);
  50. }
  51.  
  52. int CTransform::I (int row, int col) const{
  53.     assert( 0 <= row && row < 4 && 0 <= col && col < 4 );
  54.     return 4*col + row;
  55. }
  56.  
  57. void CTransform::Multiply(double* targetmatrix, double* multiplier){
  58.     CTransform kProd;
  59.     for (int iRow = 0; iRow < 4; iRow++){
  60.         for (int iCol = 0; iCol < 4; iCol++){
  61.             int i = I(iRow,iCol);
  62.             kProd.matrix[i] = 0.0;
  63.             for (int iMid = 0; iMid < 4; iMid++){
  64.                 kProd.matrix[i] +=
  65.                     targetmatrix[I(iRow,iMid)]*multiplier[I(iMid,iCol)];
  66.             }
  67.         }
  68.     }
  69.     for(int i = 0; i < 16; i++){
  70.         targetmatrix[i] = kProd.matrix[i];
  71.     }
  72. }
  73.  
  74. CTransform& CTransform::operator* (CTransform& rkM){
  75.     Multiply(matrix,rkM.matrix);
  76.     /*CTransform kProd;
  77.     for (int iRow = 0; iRow < 4; iRow++){
  78.         for (int iCol = 0; iCol < 4; iCol++){
  79.             int i = I(iRow,iCol);
  80.             kProd.matrix[i] = 0.0;
  81.             for (int iMid = 0; iMid < 4; iMid++){
  82.                 kProd.matrix[i] +=
  83.                     matrix[I(iRow,iMid)]*rkM.matrix[I(iMid,iCol)];
  84.             }
  85.         }
  86.     }*/
  87.     return (*this);
  88. }
  89.  
  90. CTransform CTransform::operator*=(CTransform b){
  91.     (*this) = ((*this) * b);
  92.     return (*this);
  93. }
  94.  
  95. double* CTransform::operator[] (int row){
  96.     return &matrix[4*row];
  97. }
  98.  
  99. Vertex3d CTransform::GetColumn(int column){
  100.     Vertex3d v;
  101.     v.x = matrix[column*4];
  102.     v.y = matrix[column*4+1];
  103.     v.z = matrix[column*4+2];
  104.     return v;
  105. }
  106.  
  107. Vertex3d CTransform::GetRow(int row){
  108.     Vertex3d v;
  109.     v.x = matrix[row];
  110.     v.y = matrix[row+4];
  111.     v.z = matrix[row+8];
  112.     return v;
  113. }
  114.  
  115. CTransform& CTransform::SetColumn(int column, Vertex3d v){
  116.     matrix[column*4] = v.x;
  117.     matrix[column*4+1] = v.y;
  118.     matrix[column*4+2] = v.z;
  119.     return (*this);
  120. }
  121.  
  122. CTransform& CTransform::SetRow(int row, Vertex3d v){
  123.     matrix[row] = v.x;
  124.     matrix[row+4] = v.y;
  125.     matrix[row+8] = v.z;
  126.     return (*this);
  127. }
  128.  
  129. CTransform& CTransform::Rotate(double angle, Vertex3d v){
  130.     //angle %= 360*(PI/180);
  131.     CTransform rot;
  132.  
  133.     rot[0][0] = 1 + (1-cos(angle))*(v.x*v.x-1);
  134.     rot[1][0] = v.z*sin(angle)+(1-cos(angle))*v.x*v.y;
  135.     rot[2][0] = -v.y*sin(angle)+(1-cos(angle))*v.x*v.z;
  136.  
  137.     rot[0][1] = -v.z*sin(angle)+(1-cos(angle))*v.x*v.y;
  138.     rot[1][1] = 1 + (1-cos(angle))*(v.y*v.y-1);
  139.     rot[2][1] = v.x*sin(angle)+(1-cos(angle))*v.y*v.z;
  140.  
  141.     rot[0][2] = v.y*sin(angle)+(1-cos(angle))*v.x*v.z;
  142.     rot[1][2] = -v.x*sin(angle)+(1-cos(angle))*v.y*v.z;
  143.     rot[2][2] = 1 + (1-cos(angle))*(v.z*v.z-1);
  144.    
  145.     Multiply(matrix,rot.matrix);
  146.  
  147.     return (*this);
  148. }
  149.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement