Clone of PhatAC @ https://github.com/floaterxk/PhatAC

Math.cpp 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "StdAfx.h"
  2. #pragma warning(disable: 4244)
  3. long RandomLong(long min, long max)
  4. {
  5. float fraction = ((float)rand() / RAND_MAX);
  6. fraction *= ((max - min) + 1);
  7. long value = fraction + min;
  8. if (value > max)
  9. value = max;
  10. return value;
  11. }
  12. float RandomFloat(float min, float max)
  13. {
  14. float fraction = ((float)rand() / RAND_MAX);
  15. fraction *= (max - min);
  16. float value = fraction + min;
  17. return value;
  18. }
  19. float FindVectorZ(const Vector& p1, const Vector& p2, const Vector& p3, float x, float y )
  20. {
  21. Vector v1 = p3-p1;
  22. Vector v2 = p2-p1;
  23. Vector normal = CrossProduct( v1, v2 ).Normalize();
  24. float poo = -( (normal.x * p1.x) + (normal.y * p1.y) + (normal.z * p1.z) );
  25. float z = (-( (normal.x * x) + (normal.y * y) + poo) ) / normal.z;
  26. return z;
  27. }
  28. /* Matrix courtesy of Asriel */
  29. matrix::matrix() {
  30. data[0][0] = 1.0f;
  31. data[0][1] = 0.0f;
  32. data[0][2] = 0.0f;
  33. data[0][3] = 0.0f;
  34. data[1][0] = 0.0f;
  35. data[1][1] = 1.0f;
  36. data[1][2] = 0.0f;
  37. data[1][3] = 0.0f;
  38. data[2][0] = 0.0f;
  39. data[2][1] = 0.0f;
  40. data[2][2] = 1.0f;
  41. data[2][3] = 0.0f;
  42. data[3][0] = 0.0f;
  43. data[3][1] = 0.0f;
  44. data[3][2] = 0.0f;
  45. data[3][3] = 1.0f;
  46. }
  47. /* General definition */
  48. void matrix::define(float xa, float xb, float xc, float xd, float ya, float yb, float yc, float yd,
  49. float za, float zb, float zc, float zd) {
  50. data[0][0] = xa;
  51. data[0][1] = xb;
  52. data[0][2] = xc;
  53. data[0][3] = xd;
  54. data[1][0] = ya;
  55. data[1][1] = yb;
  56. data[1][2] = yc;
  57. data[1][3] = yd;
  58. data[2][0] = za;
  59. data[2][1] = zb;
  60. data[2][2] = zc;
  61. data[2][3] = zd;
  62. }
  63. /* Definition by Quaternion */
  64. void matrix::defineByQuaternion(float qw, float qx, float qy, float qz) {
  65. data[0][0] = 1 - (2 * (qy * qy)) - (2 * (qz * qz));
  66. data[1][0] = (2 * qx * qy) - (2 * qw * qz);
  67. data[2][0] = (2 * qx * qz) + (2 * qw * qy);
  68. data[0][1] = (2 * qx * qy) + (2 * qw * qz);
  69. data[1][1] = 1 - (2 * (qx * qx)) - (2 * (qz * qz));
  70. data[2][1] = (2 * qy * qz) - (2 * qw * qx);
  71. data[0][2] = (2 * qx * qz) - (2 * qw * qy);
  72. data[1][2] = (2 * qy * qz) + (2 * qw * qx);
  73. data[2][2] = 1 - (2 * (qx * qx)) - (2 * (qy * qy));
  74. }
  75. /* Definition by Eulerian angular rotation */
  76. #pragma warning(disable : 4244)
  77. void matrix::defineByRotation(float roll, float pitch, float yaw) {
  78. double sr,sp,sy,cr,cp,cy;
  79. matrix mp, my;
  80. sr = sin(DEG2RAD(roll));
  81. cr = cos(DEG2RAD(roll));
  82. sp = sin(DEG2RAD(pitch));
  83. cp = cos(DEG2RAD(pitch));
  84. sy = sin(DEG2RAD(yaw));
  85. cy = cos(DEG2RAD(yaw));
  86. data[0][0] = data[1][1] = cr;
  87. data[1][0] = -(data[0][1] = sr);
  88. mp.data[1][1] = mp.data[2][2] = cp;
  89. mp.data[1][2] = -(mp.data[2][1] = sp);
  90. my.data[0][0] = my.data[2][2] = cy;
  91. my.data[0][2] = -(my.data[2][0] = sy);
  92. multiply(my);
  93. multiply(mp);
  94. }
  95. void matrix::applyRotation(float roll, float pitch, float yaw) {
  96. matrix mat;
  97. mat.defineByRotation(roll, pitch, yaw);
  98. multiply(mat);
  99. }
  100. void matrix::applyTranslation(float x, float y, float z) {
  101. data[0][3] = x;
  102. data[1][3] = y;
  103. data[2][3] = z;
  104. }
  105. /* Apply this matrix to a vector */
  106. void matrix::applyToVector(Vector &vect) {
  107. float xo, yo, zo, wo;
  108. xo = vect.x;
  109. yo = vect.y;
  110. zo = vect.z;
  111. wo = 1.0f;
  112. vect.x = xo * data[0][0] + yo * data[1][0] + zo * data[2][0] + wo * data[3][0];
  113. vect.y = xo * data[0][1] + yo * data[1][1] + zo * data[2][1] + wo * data[3][0];
  114. vect.z = xo * data[0][2] + yo * data[1][2] + zo * data[2][2] + wo * data[3][0];
  115. }
  116. void matrix::copy(matrix &dest) {
  117. dest.define(data[0][0], data[0][1], data[0][2], data[0][3],
  118. data[1][0], data[1][1], data[1][2], data[1][3],
  119. data[2][0], data[2][1], data[2][2], data[2][3]);
  120. }
  121. void matrix::multiply(matrix second)
  122. {
  123. matrix temp;
  124. copy(temp);
  125. for (int j = 0; j < 4; j++)
  126. for (int i = 0; i < 4; i++)
  127. data[i][j] = temp.data[i][0] * second.data[0][j] +
  128. temp.data[i][1] * second.data[1][j] +
  129. temp.data[i][2] * second.data[2][j] +
  130. temp.data[i][3] * second.data[3][j];
  131. }
  132. // Checks if the sum of two 32-bit values will overflow.
  133. void inline WillOF( DWORD v1, DWORD v2, BOOL *bResult )
  134. {
  135. #ifdef _WIN32
  136. __asm {
  137. mov eax, DWORD PTR [v1]
  138. add eax, DWORD PTR [v2]
  139. xor eax, eax
  140. adc eax, eax
  141. mov DWORD PTR [bResult], eax
  142. }
  143. #else
  144. *bResult = TRUE;
  145. #endif
  146. }