CoordGeom.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:4k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once 
  22. #ifndef PI
  23. #define PI (3.141592654)
  24. #endif
  25. #define DegToRad(d) ((d)*PI/180.0)
  26. #define RadToDeg(r) ((r)*180.0/PI)
  27. #define Sgn(d) (IsZero(d) ? 0 : (d) > 0 ? 1 : -1)
  28. #define SgnPow(d, p) (IsZero(d) ? 0 : (pow(fabs(d), p) * Sgn(d)))
  29. class Vector
  30. {
  31. public:
  32. double x, y, z;
  33. Vector() {x = y = z = 0;}
  34. Vector(double x, double y, double z);
  35. void Set(double x, double y, double z);
  36. Vector Normal(Vector& a, Vector& b);
  37. double Angle(Vector& a, Vector& b);
  38. double Angle(Vector& a);
  39. void Angle(double& u, double& v); // returns spherical coords in radian, -PI/2 <= u <= PI/2, -PI <= v <= PI
  40. Vector Angle(); // does like prev., returns 'u' in 'ret.x', and 'v' in 'ret.y'
  41. Vector Unit();
  42. Vector& Unitalize();
  43. double Length();
  44. double Sum(); // x + y + z
  45. double CrossSum(); // xy + xz + yz
  46. Vector Cross(); // xy, xz, yz
  47. Vector Pow(double exp);
  48. Vector& Min(Vector& a);
  49. Vector& Max(Vector& a);
  50. Vector Abs();
  51. Vector Reflect(Vector& n);
  52. Vector Refract(Vector& n, double nFront, double nBack, double* nOut = NULL);
  53. Vector Refract2(Vector& n, double nFrom, double nTo, double* nOut = NULL);
  54. Vector operator - ();
  55. double& operator [] (int i);
  56. double operator | (Vector& v); // dot
  57. Vector operator % (Vector& v); // cross
  58. bool operator == (const Vector& v) const;
  59. bool operator != (const Vector& v) const;
  60. Vector operator + (double d);
  61. Vector operator + (Vector& v);
  62. Vector operator - (double d);
  63. Vector operator - (Vector& v);
  64. Vector operator * (double d);
  65. Vector operator * (Vector& v);
  66. Vector operator / (double d);
  67. Vector operator / (Vector& v);
  68. Vector& operator += (double d);
  69. Vector& operator += (Vector& v);
  70. Vector& operator -= (double d);
  71. Vector& operator -= (Vector& v);
  72. Vector& operator *= (double d);
  73. Vector& operator *= (Vector& v);
  74. Vector& operator /= (double d);
  75. Vector& operator /= (Vector& v);
  76. };
  77. class Ray
  78. {
  79. public:
  80. Vector p, d;
  81. Ray() {}
  82. Ray(Vector& p, Vector& d);
  83. void Set(Vector& p, Vector& d);
  84. double GetDistanceFrom(Ray& r); // r = plane
  85. double GetDistanceFrom(Vector& v); // v = point
  86. Vector operator [] (double t);
  87. };
  88. class XForm
  89. {
  90. class Matrix
  91. {
  92. public:
  93. double mat[4][4];
  94. Matrix();
  95. void Initalize();
  96. Matrix operator * (Matrix& m);
  97. Matrix& operator *= (Matrix& m);
  98. } m;
  99. bool m_isWorldToLocal;
  100. public:
  101. XForm() {}
  102. XForm(Ray& r, Vector& s, bool isWorldToLocal = true);
  103. void Initalize();
  104. void Initalize(Ray& r, Vector& s, bool isWorldToLocal = true);
  105. void operator *= (Vector& s); // scale
  106. void operator += (Vector& t); // translate
  107. void operator <<= (Vector& r); // rotate
  108. void operator /= (Vector& s); // scale
  109. void operator -= (Vector& t); // translate
  110. void operator >>= (Vector& r); // rotate
  111. // transformations
  112. Vector operator < (Vector& n); // normal
  113. Vector operator << (Vector& v); // vector
  114. Ray operator << (Ray& r); // ray
  115. };