Vector.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "core/Vector.h"
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include "core/Utility.h"
  5. typedef CoreVector2 V2;
  6. typedef CoreVector3 V3;
  7. typedef CoreVector4 V4;
  8. typedef CoreIntVector2 IV2;
  9. typedef CoreIntVector3 IV3;
  10. typedef CoreIntVector4 IV4;
  11. V3* coreAngles(V3* r, float lengthAngle, float widthAngle) {
  12. lengthAngle = coreDegreeToRadian(lengthAngle);
  13. widthAngle = coreDegreeToRadian(widthAngle);
  14. float sWidth = sinf(widthAngle);
  15. float cWidth = cosf(widthAngle);
  16. float sLength = sinf(lengthAngle);
  17. float cLength = cosf(lengthAngle);
  18. r->data[0] = cWidth * cLength;
  19. r->data[1] = sWidth;
  20. r->data[2] = -sLength * cWidth;
  21. return r;
  22. }
  23. V3* coreCross(V3* r, const V3* a, const V3* b) {
  24. r->data[0] = a->data[1] * b->data[2] - a->data[2] * b->data[1];
  25. r->data[1] = a->data[2] * b->data[0] - a->data[0] * b->data[2];
  26. r->data[2] = a->data[0] * b->data[1] - a->data[1] * b->data[0];
  27. return r;
  28. }
  29. #define VECTOR_IMPL(T, N, FT) \
  30. T* coreAddSet##T(T* r, const T* a) { \
  31. return coreAdd##T(r, r, a); \
  32. } \
  33. \
  34. T* coreAdd##T(T* r, const T* a, const T* b) { \
  35. for(int i = 0; i < N; i++) { \
  36. r->data[i] = a->data[i] + b->data[i]; \
  37. } \
  38. return r; \
  39. } \
  40. \
  41. T* coreSubSet##T(T* r, const T* a) { \
  42. return coreSub##T(r, r, a); \
  43. } \
  44. \
  45. T* coreSub##T(T* r, const T* a, const T* b) { \
  46. for(int i = 0; i < N; i++) { \
  47. r->data[i] = a->data[i] - b->data[i]; \
  48. } \
  49. return r; \
  50. } \
  51. \
  52. T* coreMulSet##T(T* r, const T* a) { \
  53. return coreMul##T(r, r, a); \
  54. } \
  55. \
  56. T* coreMul##T(T* r, const T* a, const T* b) { \
  57. for(int i = 0; i < N; i++) { \
  58. r->data[i] = a->data[i] * b->data[i]; \
  59. } \
  60. return r; \
  61. } \
  62. \
  63. T* coreDivSet##T(T* r, const T* a) { \
  64. return coreDiv##T(r, r, a); \
  65. } \
  66. \
  67. T* coreDiv##T(T* r, const T* a, const T* b) { \
  68. for(int i = 0; i < N; i++) { \
  69. r->data[i] = a->data[i] / b->data[i]; \
  70. } \
  71. return r; \
  72. } \
  73. \
  74. T* coreMulSet##T##F(T* r, FT f) { \
  75. return coreMul##T##F(r, r, f); \
  76. } \
  77. \
  78. T* coreMul##T##F(T* r, const T* a, FT f) { \
  79. for(int i = 0; i < N; i++) { \
  80. r->data[i] = a->data[i] * f; \
  81. } \
  82. return r; \
  83. } \
  84. \
  85. T* coreDivSet##T##F(T* r, FT f) { \
  86. return coreDiv##T##F(r, r, f); \
  87. } \
  88. \
  89. T* coreDiv##T##F(T* r, const T* a, FT f) { \
  90. for(int i = 0; i < N; i++) { \
  91. r->data[i] = a->data[i] / f; \
  92. } \
  93. return r; \
  94. } \
  95. \
  96. T* coreInvertSet##T(T* r) { \
  97. return coreInvert##T(r, r); \
  98. } \
  99. \
  100. T* coreInvert##T(T* r, const T* a) { \
  101. for(int i = 0; i < N; i++) { \
  102. r->data[i] = -a->data[i]; \
  103. } \
  104. return r; \
  105. }
  106. #define VECTOR_IMPL_FLOAT(T, N, CN) \
  107. float coreDot##T(const T* a, const T* b) { \
  108. float length = 0; \
  109. for(int i = 0; i < N; i++) { \
  110. length += a->data[i] * b->data[i]; \
  111. } \
  112. return length; \
  113. } \
  114. \
  115. float coreSquareLength##T(const T* a) { \
  116. return coreDot##T(a, a); \
  117. } \
  118. \
  119. float coreLength##T(const T* a) { \
  120. return sqrtf(coreSquareLength##T(a)); \
  121. } \
  122. \
  123. T* coreNormalize##T(T* r) { \
  124. return coreMulSet##T##F(r, 1.0f / coreLength##T(r)); \
  125. } \
  126. \
  127. T* coreConvertI##T(T* r, const CN* a) { \
  128. for(int i = 0; i < N; i++) { \
  129. r->data[i] = (float)a->data[i]; \
  130. } \
  131. return r; \
  132. } \
  133. \
  134. CN* coreConvert##T(CN* r, const T* a) { \
  135. for(int i = 0; i < N; i++) { \
  136. r->data[i] = (int)a->data[i]; \
  137. } \
  138. return r; \
  139. }
  140. VECTOR_IMPL(V2, 2, float)
  141. VECTOR_IMPL(V3, 3, float)
  142. VECTOR_IMPL(V4, 4, float)
  143. VECTOR_IMPL(IV2, 2, int)
  144. VECTOR_IMPL(IV3, 3, int)
  145. VECTOR_IMPL(IV4, 4, int)
  146. VECTOR_IMPL_FLOAT(V2, 2, IV2)
  147. VECTOR_IMPL_FLOAT(V3, 3, IV3)
  148. VECTOR_IMPL_FLOAT(V4, 4, IV4)
  149. static size_t safeCast(int s) {
  150. return s < 0 ? 0 : (size_t)s;
  151. }
  152. size_t coreToStringV2(const V2* a, char* buffer, size_t n) {
  153. return safeCast(snprintf(buffer, n, "[%.3f, %.3f]", (double)a->data[0],
  154. (double)a->data[1]));
  155. }
  156. size_t coreToStringV3(const V3* a, char* buffer, size_t n) {
  157. return safeCast(snprintf(buffer, n, "[%.3f, %.3f, %.3f]",
  158. (double)a->data[0], (double)a->data[1],
  159. (double)a->data[2]));
  160. }
  161. size_t coreToStringV4(const V4* a, char* buffer, size_t n) {
  162. return safeCast(snprintf(buffer, n, "[%.3f, %.3f, %.3f, %.3f]",
  163. (double)a->data[0], (double)a->data[1],
  164. (double)a->data[2], (double)a->data[3]));
  165. }
  166. size_t coreToStringIV2(const IV2* a, char* buffer, size_t n) {
  167. return safeCast(snprintf(buffer, n, "[%d, %d]", a->data[0], a->data[1]));
  168. }
  169. size_t coreToStringIV3(const IV3* a, char* buffer, size_t n) {
  170. return safeCast(snprintf(buffer, n, "[%d, %d, %d]", a->data[0], a->data[1],
  171. a->data[2]));
  172. }
  173. size_t coreToStringIV4(const IV4* a, char* buffer, size_t n) {
  174. return safeCast(snprintf(buffer, n, "[%d, %d, %d, %d]", a->data[0],
  175. a->data[1], a->data[2], a->data[3]));
  176. }