⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hmatrix3.cpp

📁 用于GPU通用计算的编程语言BrookGPU 0.4
💻 CPP
字号:
#include "HMatrix3.h"


HMatrix3::HMatrix3(){
  setIdentity();
}

HMatrix3::~HMatrix3(){}

void HMatrix3::setIdentity(){
  int i,j;
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++)
      if (i == j)
	data[i][j] = 1.0;
      else
	data[i][j] = 0.0;
}

Tuple3f HMatrix3::apply(const Tuple3f &p){
  float x = data[0][0]*p.x + data[0][1]*p.y + data[0][2]*p.z + data[0][3];
  float y = data[1][0]*p.x + data[1][1]*p.y + data[1][2]*p.z + data[1][3];
  float z = data[2][0]*p.x + data[2][1]*p.y + data[2][2]*p.z + data[2][3];
  float h = data[3][0]*p.x + data[3][1]*p.y + data[3][2]*p.z + data[3][3];
  return Point3(x/h, y/h, z/h);
}

  
HMatrix3 HMatrix3::multiply(const HMatrix3 &m1, const HMatrix3 &m2){
  HMatrix3 m;
  int r,c,i;
  for (r = 0; r < 4; r++)
    for (c = 0; c < 4; c++){
      m.data[r][c] = 0;
      for (i = 0; i < 4; i++)
	m.data[r][c] += m1.data[r][i] * m2.data[i][c];
    }
  return m;
}

void HMatrix3::translate(float tx, float ty, float tz, int dir){
  HMatrix3 m;
  m.data[0][3] = tx;
  m.data[1][3] = ty;
  m.data[2][3] = tz;
  if(dir)
    *this = HMatrix3::multiply(*this,m);
  else
    *this = HMatrix3::multiply(m,*this);
}

void HMatrix3::scale(float sx, float sy, float sz, int dir){
  HMatrix3 m;
  m.data[0][0] = sx;
  m.data[1][1] = sy;
  m.data[2][2] = sz;
  if(dir)
    *this = HMatrix3::multiply(*this,m);
  else
    *this = HMatrix3::multiply(m,*this);
}

void HMatrix3::rotatex(float theta, int dir){
  HMatrix3 m;
  theta = theta*M_PI/180.0f;
  float ct = cosf(theta);
  float st = sinf(theta);
  m.data[1][1] = ct;
  m.data[1][2] = -st;
  m.data[2][1] = st;
  m.data[2][2] = ct;
  if(dir)
    *this = HMatrix3::multiply(*this,m);
  else
    *this = HMatrix3::multiply(m,*this);
}

void HMatrix3::rotatey(float theta, int dir){
  HMatrix3 m;
  theta = theta*M_PI/180.0f;
  float ct = cosf(theta);
  float st = sinf(theta);
  m.data[0][0] = ct;
  m.data[0][2] = st;
  m.data[2][0] = -st;
  m.data[2][2] = ct;
  if(dir)
    *this = HMatrix3::multiply(*this,m);
  else
    *this = HMatrix3::multiply(m,*this);
}

void HMatrix3::rotatez(float theta, int dir){
  HMatrix3 m;
  theta = theta*M_PI/180.0f;
  float ct = cosf(theta);
  float st = sinf(theta);
  m.data[0][0] = ct;
  m.data[0][1] = -st;
  m.data[1][0] = st;
  m.data[1][1] = ct;
  if(dir)
    *this = HMatrix3::multiply(*this,m);
  else
    *this = HMatrix3::multiply(m,*this);
}

void HMatrix3::rotate(const Vector3 &ax, float theta, int dir) {
  HMatrix3 m;
  Vector3 axis = ax.Normalize();
  float s = sinf(theta);
  float c = cosf(theta);
  
  m.data[0][0] = axis.x * axis.x + (1.f - axis.x * axis.x) * c;
  m.data[0][1] = axis.x * axis.y * (1 - c) - axis.z * s;
  m.data[0][2] = axis.x * axis.z * (1 - c) + axis.y * s;
  m.data[1][0] = axis.x * axis.y * (1 - c) + axis.z * s;
  m.data[1][1] = axis.y * axis.y + (1 - axis.y * axis.y) * c;
  m.data[1][2] = axis.y * axis.z * (1 - c) - axis.x * s;
  m.data[2][0] = axis.x * axis.z * (1 - c) - axis.y * s;
  m.data[2][1] = axis.y * axis.z * (1 - c) + axis.x * s;
  m.data[2][2] = axis.z * axis.z + (1 - axis.z * axis.z) * c;
  if(dir)
    *this = HMatrix3::multiply(*this,m);
  else
    *this = HMatrix3::multiply(m,*this);
}


HMatrix3 HMatrix3::Transpose(HMatrix3 M){
  HMatrix3 temp;
  int i,j;
  for(i=0; i<4; i++)
    for(j=0; j<4; j++)
      temp.data[i][j] = M.data[j][i];
  return temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -