Vector.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "core/Vector.h"
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include "core/ToString.h"
  5. #include "core/Utility.h"
  6. typedef Vector2 V2;
  7. typedef Vector3 V3;
  8. typedef Vector4 V4;
  9. typedef IntVector2 IV2;
  10. typedef IntVector3 IV3;
  11. typedef IntVector4 IV4;
  12. V3* angles(V3* r, float lengthAngle, float widthAngle) {
  13. lengthAngle = degreeToRadian(lengthAngle);
  14. widthAngle = degreeToRadian(widthAngle);
  15. float sWidth = sinf(widthAngle);
  16. float cWidth = cosf(widthAngle);
  17. float sLength = sinf(lengthAngle);
  18. float cLength = cosf(lengthAngle);
  19. r->data[0] = cWidth * cLength;
  20. r->data[1] = sWidth;
  21. r->data[2] = -sLength * cWidth;
  22. return r;
  23. }
  24. V3* cross(V3* r, const V3* a, const V3* b) {
  25. r->data[0] = a->data[1] * b->data[2] - a->data[2] * b->data[1];
  26. r->data[1] = a->data[2] * b->data[0] - a->data[0] * b->data[2];
  27. r->data[2] = a->data[0] * b->data[1] - a->data[1] * b->data[0];
  28. return r;
  29. }
  30. #define VECTOR_IMPL(T, N, FT) \
  31. T* addSet##T(T* r, const T* a) { \
  32. return add##T(r, r, a); \
  33. } \
  34. \
  35. T* add##T(T* r, const T* a, const T* b) { \
  36. for(int i = 0; i < N; i++) { \
  37. r->data[i] = a->data[i] + b->data[i]; \
  38. } \
  39. return r; \
  40. } \
  41. \
  42. T* subSet##T(T* r, const T* a) { \
  43. return sub##T(r, r, a); \
  44. } \
  45. \
  46. T* sub##T(T* r, const T* a, const T* b) { \
  47. for(int i = 0; i < N; i++) { \
  48. r->data[i] = a->data[i] - b->data[i]; \
  49. } \
  50. return r; \
  51. } \
  52. \
  53. T* mulSet##T(T* r, const T* a) { \
  54. return mul##T(r, r, a); \
  55. } \
  56. \
  57. T* mul##T(T* r, const T* a, const T* b) { \
  58. for(int i = 0; i < N; i++) { \
  59. r->data[i] = a->data[i] * b->data[i]; \
  60. } \
  61. return r; \
  62. } \
  63. \
  64. T* divSet##T(T* r, const T* a) { \
  65. return div##T(r, r, a); \
  66. } \
  67. \
  68. T* div##T(T* r, const T* a, const T* b) { \
  69. for(int i = 0; i < N; i++) { \
  70. r->data[i] = a->data[i] / b->data[i]; \
  71. } \
  72. return r; \
  73. } \
  74. \
  75. T* mulSet##T##F(T* r, FT f) { \
  76. return mul##T##F(r, r, f); \
  77. } \
  78. \
  79. T* mul##T##F(T* r, const T* a, FT f) { \
  80. for(int i = 0; i < N; i++) { \
  81. r->data[i] = a->data[i] * f; \
  82. } \
  83. return r; \
  84. } \
  85. \
  86. T* divSet##T##F(T* r, FT f) { \
  87. return div##T##F(r, r, f); \
  88. } \
  89. \
  90. T* div##T##F(T* r, const T* a, FT f) { \
  91. for(int i = 0; i < N; i++) { \
  92. r->data[i] = a->data[i] / f; \
  93. } \
  94. return r; \
  95. } \
  96. \
  97. T* invertSet##T(T* r) { \
  98. return invert##T(r, r); \
  99. } \
  100. \
  101. T* invert##T(T* r, const T* a) { \
  102. for(int i = 0; i < N; i++) { \
  103. r->data[i] = -a->data[i]; \
  104. } \
  105. return r; \
  106. }
  107. #define VECTOR_IMPL_FLOAT(T, N, CN) \
  108. float dot##T(const T* a, const T* b) { \
  109. float length = 0; \
  110. for(int i = 0; i < N; i++) { \
  111. length += a->data[i] * b->data[i]; \
  112. } \
  113. return length; \
  114. } \
  115. \
  116. float squareLength##T(const T* a) { \
  117. return dot##T(a, a); \
  118. } \
  119. \
  120. float length##T(const T* a) { \
  121. return sqrtf(squareLength##T(a)); \
  122. } \
  123. \
  124. T* normalize##T(T* r) { \
  125. return mulSet##T##F(r, 1.0f / length##T(r)); \
  126. } \
  127. \
  128. T* convertI##T(T* r, const CN* a) { \
  129. for(int i = 0; i < N; i++) { \
  130. r->data[i] = (float)a->data[i]; \
  131. } \
  132. return r; \
  133. } \
  134. \
  135. CN* convert##T(CN* r, const T* a) { \
  136. for(int i = 0; i < N; i++) { \
  137. r->data[i] = (int)a->data[i]; \
  138. } \
  139. return r; \
  140. }
  141. VECTOR_IMPL(V2, 2, float)
  142. VECTOR_IMPL(V3, 3, float)
  143. VECTOR_IMPL(V4, 4, float)
  144. VECTOR_IMPL(IV2, 2, int)
  145. VECTOR_IMPL(IV3, 3, int)
  146. VECTOR_IMPL(IV4, 4, int)
  147. VECTOR_IMPL_FLOAT(V2, 2, IV2)
  148. VECTOR_IMPL_FLOAT(V3, 3, IV3)
  149. VECTOR_IMPL_FLOAT(V4, 4, IV4)
  150. size_t toStringV2(const V2* a, char* buffer, size_t n) {
  151. return toString(buffer, n, "[%.3f, %.3f]", (double)a->data[0],
  152. (double)a->data[1]);
  153. }
  154. size_t toStringV3(const V3* a, char* buffer, size_t n) {
  155. return toString(buffer, n, "[%.3f, %.3f, %.3f]", (double)a->data[0],
  156. (double)a->data[1], (double)a->data[2]);
  157. }
  158. size_t toStringV4(const V4* a, char* buffer, size_t n) {
  159. return toString(buffer, n, "[%.3f, %.3f, %.3f, %.3f]", (double)a->data[0],
  160. (double)a->data[1], (double)a->data[2], (double)a->data[3]);
  161. }
  162. size_t toStringIV2(const IV2* a, char* buffer, size_t n) {
  163. return toString(buffer, n, "[%d, %d]", a->data[0], a->data[1]);
  164. }
  165. size_t toStringIV3(const IV3* a, char* buffer, size_t n) {
  166. return toString(buffer, n, "[%d, %d, %d]", a->data[0], a->data[1],
  167. a->data[2]);
  168. }
  169. size_t toStringIV4(const IV4* a, char* buffer, size_t n) {
  170. return toString(buffer, n, "[%d, %d, %d, %d]", a->data[0], a->data[1],
  171. a->data[2], a->data[3]);
  172. }