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

📄 mtxlib.cpp

📁 游戏编程精髓里的人工智能源代码很好的源代码!
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  x = xIn;  y = yIn;  z = zIn;  w = wIn;}// Get length of a vector4float vector4::length() const {  return (float) sqrt(x*x + y*y + z*z + w*w);}// Get squared length of a vector4float vector4::lengthSqr() const {  return (x*x + y*y + z*z + w*w);}// Does vector4 equal (0, 0, 0, 0)?bool vector4::isZero() const {  return ((x == 0.0F) && (y == 0.0F) && (z == 0.0F) && (w == 0.0F));}// Normalize a vector4vector4 &vector4::normalize() {  float m = length();  if (m > 0.0F)     m = 1.0F / m;  else     m = 0.0F;  x *= m;  y *= m;  z *= m;  w *= m;  return *this;}////////////////////////////////////////////////////////////// Miscellaneous vector functions//// Return Normal of vector2'svector2 Normalized(const vector2 &a){  vector2 ret(a);  return ret.normalize();}// Return Normal of vector3'svector3 Normalized(const vector3 &a){  vector3 ret(a);  return ret.normalize();}// Return Normal of vector4'svector4 Normalized(const vector4 &a){  vector4 ret(a);  return ret.normalize();}// Dot product of two vector2'sfloat DotProduct(const vector2 &a, const vector2 &b) {  return a.x*b.x + a.y*b.y;}// Dot product of two vector3'sfloat DotProduct(const vector3 &a, const vector3 &b) {  return a.x*b.x + a.y*b.y + a.z*b.z;}// Dot product of two vector4'sfloat DotProduct(const vector4 &a, const vector4 &b) {  return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;}// Swap two vector2'svoid SwapVec(vector2 &a, vector2 &b) {  vector2 tmp(a);  a = b;  b = tmp;}// Swap two vector3'svoid SwapVec(vector3 &a, vector3 &b) {  vector3 tmp(a);  a = b;  b = tmp;}// Swap two vector4'svoid SwapVec(vector4 &a, vector4 &b) {  vector4 tmp(a);  a = b;  b = tmp;}// Cross product of two vector3'svector3 CrossProduct(const vector3 &a, const vector3 &b) {  return vector3(a.y*b.z - a.z*b.y,                 a.z*b.x - a.x*b.z,                 a.x*b.y - a.y*b.x);}// Are these two vector2's nearly equal?bool NearlyEquals( const vector2& a, const vector2& b, float r ) {  vector2 diff = a - b; // difference  return (DotProduct(diff, diff) < r*r); // radius}// Are these two vector3's nearly equal?bool NearlyEquals( const vector3& a, const vector3& b, float r ) {  vector3 diff = a - b; // difference  return (DotProduct(diff, diff) < r*r); // radius}// Are these two vector4's nearly equal?bool NearlyEquals( const vector4& a, const vector4& b, float r ) {  vector4 diff = a - b; // difference  return (DotProduct(diff, diff) < r*r); // radius}////////////////////////////////////////////////////////////// matrix33 class//// Constructor with initializing valuematrix33::matrix33(float v) {  col[0].set(v, v, v);  col[1].set(v, v, v);  col[2].set(v, v, v);}// Constructor with initializing matrix33matrix33::matrix33(const matrix33 &m) {  col[0] = m[0];  col[1] = m[1];  col[2] = m[2];}// Constructor with initializing vector3'smatrix33::matrix33(const vector3 &v0, const vector3 &v1, const vector3 &v2) {  col[0] = v0;  col[1] = v1;  col[2] = v2;}// Array indexingvector3 &matrix33::operator [] (unsigned int i) {  assert (i<3);          return (vector3&)col[i];}// Array indexingconst vector3 &matrix33::operator [] (unsigned int i) const {  assert (i<3);  return (vector3&)col[i];}// Assignmatrix33 &matrix33::operator = (const matrix33 &m) {  col[0] = m[0];  col[1] = m[1];  col[2] = m[2];  return *this;}// Add a matrix33 to this onematrix33 &matrix33::operator += (const matrix33 &m) {  col[0] += m[0];  col[1] += m[1];  col[2] += m[2];  return *this;}// Subtract a matrix33 from this onematrix33 &matrix33::operator -= (const matrix33 &m) {  col[0] -= m[0];  col[1] -= m[1];  col[2] -= m[2];  return *this;}// Multiply the matrix33 by another matrix33matrix33 &matrix33::operator *= (const matrix33 &m) {  matrix33 t;    for (unsigned int r = 0; r < 3; r++)   {    for (unsigned int c = 0; c < 3; c++)     {      float f = 0;                f += col[0][r] * m[c][0];      f += col[1][r] * m[c][1];      f += col[2][r] * m[c][2];                t[c][r] = f;    }  }    *this = t;    return *this;}// Multiply the matrix33 by a floatmatrix33 &matrix33::operator *= (float f) {  col[0] *= f;  col[1] *= f;  col[2] *= f;  return *this;}// Are these two matrix33's equal?bool operator == (const matrix33 &a, const matrix33 &b) {  return ((a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]));}// Are these two matrix33's not equal?bool operator != (const matrix33 &a, const matrix33 &b) {  return ((a[0] != b[0]) || (a[1] != b[1]) || (a[2] != b[2]));}// Add two matrix33'smatrix33 operator + (const matrix33 &a, const matrix33 &b) {  matrix33 ret(a);  ret += b;  return ret;}// Subtract one matrix33 from anothermatrix33 operator - (const matrix33 &a, const matrix33 &b) {  matrix33 ret(a);  ret -= b;  return ret;}// Multiply matrix33 by another matrix33matrix33 operator * (const matrix33 &a, const matrix33 &b) {  matrix33 ret(a);  ret *= b;  return ret;}// Multiply a vector3 by this matrix33vector3 operator * (const matrix33 &m, const vector3 &v) {  vector3 ret;  ret.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0];  ret.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1];  ret.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2];  return ret;}// Multiply a vector3 by this matrix33vector3 operator * (const vector3 &v, const matrix33 &m) {  vector3 ret;  ret.x = DotProduct(m[0], v);  ret.y = DotProduct(m[1], v);  ret.z = DotProduct(m[2], v);  return ret;}// Multiply matrix33 by a floatmatrix33 operator * (float f, const matrix33 &m) {  matrix33 ret(m);  ret *= f;  return ret;}// Multiply matrix33 by a floatmatrix33 operator * (const matrix33 &m, float f) {  matrix33 ret(m);  ret *= f;  return ret;}// Set matrix33 to the identity matrixmatrix33 &matrix33::identity() {  for (unsigned int c = 0; c < 3; c++)   {    for (unsigned int r = 0; r < 3; r++)     {      if (c == r)         col[c][r] = 1.0F;      else         col[c][r] = 0.0F;    }   }    return *this;}// Transpose the matrix33matrix33 &matrix33::transpose() {  float t;    for (unsigned int c = 0; c < 3; c++)   {    for (unsigned int r = c + 1; r < 3; r++)     {      t = col[c][r];      col[c][r] = col[r][c];      col[r][c] = t;    }   }    return *this;}// Invert the matrix33matrix33 &matrix33::invert() {  matrix33 a(*this);  matrix33 b(IdentityMatrix33());  unsigned int c, r;  unsigned int cc;  unsigned int rowMax; // Points to max abs value row in this column  unsigned int row;  float tmp;  // Go through columns  for (c=0; c<3; c++)   {    // Find the row with max value in this column    rowMax = c;    for (r=c+1; r<3; r++)     {      if (fabs(a[c][r]) > fabs(a[c][rowMax]))       {        rowMax = r;      }    }          // If the max value here is 0, we can't invert.  Return identity.    if (a[rowMax][c] == 0.0F)       return (identity());          // Swap row "rowMax" with row "c"    for (cc=0; cc<3; cc++)     {      tmp = a[cc][c];      a[cc][c] = a[cc][rowMax];      a[cc][rowMax] = tmp;      tmp = b[cc][c];      b[cc][c] = b[cc][rowMax];      b[cc][rowMax] = tmp;    }          // Now everything we do is on row "c".    // Set the max cell to 1 by dividing the entire row by that value    tmp = a[c][c];    for (cc=0; cc<3; cc++)     {      a[cc][c] /= tmp;      b[cc][c] /= tmp;    }          // Now do the other rows, so that this column only has a 1 and 0's    for (row = 0; row < 3; row++)     {      if (row != c)       {        tmp = a[c][row];        for (cc=0; cc<3; cc++)         {          a[cc][row] -= a[cc][c] * tmp;          b[cc][row] -= b[cc][c] * tmp;        }      }    }        }    *this = b;    return *this;}// Return a matrix33 set to the identity matrixmatrix33 IdentityMatrix33() {  matrix33 ret;  return ret.identity();}// Return the transpose of the matrix33matrix33 TransposeMatrix33(const matrix33 &m) {  matrix33 ret(m);  return ret.transpose();}// Return the inverted matrix33matrix33 InvertMatrix33(const matrix33 &m) {  matrix33 ret(m);  return ret.invert();}// Return a 2D rotation matrix33matrix33 RotateRadMatrix33(float rad) {  matrix33 ret;  float sinA, cosA;  sinA = (float)sin(rad);  cosA = (float)cos(rad);  ret[0][0] = cosA; ret[1][0] = -sinA; ret[2][0] = 0.0F;  ret[0][1] = sinA; ret[1][1] =  cosA; ret[2][1] = 0.0F;  ret[0][2] = 0.0F; ret[1][2] =  0.0F; ret[2][2] = 1.0F;  return ret;}// Return a 2D translation matrix33matrix33 TranslateMatrix33(float x, float y) {  matrix33 ret;  ret.identity();  ret[2][0] = x;  ret[2][1] = y;  return ret;}// Return a 2D/3D scale matrix33matrix33 ScaleMatrix33(float x, float y, float z) {  matrix33 ret;  ret.identity();  ret[0][0] = x;  ret[1][1] = y;  ret[2][2] = z;  return ret;}////////////////////////////////////////////////////////////// matrix44 class//// Constructor with initializing valuematrix44::matrix44(float v) {  col[0].set(v, v, v, v);  col[1].set(v, v, v, v);  col[2].set(v, v, v, v);  col[3].set(v, v, v, v);}// Constructor with initializing matrix44matrix44::matrix44(const matrix44 &m) {  col[0] = m[0];  col[1] = m[1];  col[2] = m[2];  col[3] = m[3];}// Constructor with initializing matrix33matrix44::matrix44(const matrix33 &m) {  col[0] = m[0];  col[1] = m[1];  col[2] = m[2];  col[3] = vector4(0.0, 0.0, 0.0, 1.0);}// Constructor with initializing vector4'smatrix44::matrix44(const vector4 &v0, const vector4 &v1,                    const vector4 &v2, const vector4 &v3) {  col[0] = v0;  col[1] = v1;  col[2] = v2;  col[3] = v3;}// Array indexingvector4 &matrix44::operator [] (unsigned int i) {  assert (i<4);  return (vector4&) col[i];}// Array indexingconst vector4 &matrix44::operator [] (unsigned int i) const {  assert (i<4);    return (vector4&) col[i];}// Assignmatrix44 &matrix44::operator = (const matrix44 &m) {  col[0] = m[0];  col[1] = m[1];  col[2] = m[2];  col[3] = m[3];  return *this;}// Assign a matrix33 to the matrix44matrix44 &matrix44::operator = (const matrix33 &m) {  col[0] = m[0];  col[1] = m[1];  col[2] = m[2];  col[3] = vector4(0.0, 0.0, 0.0, 1.0);  return *this;}// Add a matrix44 to this onematrix44 &matrix44::operator += (const matrix44 &m) {  col[0] += m[0];  col[1] += m[1];  col[2] += m[2];  col[3] += m[3];  return *this;}// Subtract a matrix44 from this onematrix44 &matrix44::operator -= (const matrix44 &m) {

⌨️ 快捷键说明

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