math.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #ifndef MATH_H
  2. #define MATH_H
  3. #include "stdint.h"
  4. typedef struct {
  5. int x;
  6. int y;
  7. } RI_vector_2;
  8. typedef struct {
  9. double x;
  10. double y;
  11. } RI_vector_2f;
  12. typedef struct {
  13. double x;
  14. double y;
  15. double z;
  16. } RI_vector_3f;
  17. typedef struct {
  18. double w;
  19. double x;
  20. double y;
  21. double z;
  22. } RI_vector_4f;
  23. void vector_2f_times_double(RI_vector_2f *vector, double value){
  24. vector->x *= value;
  25. vector->y *= value;
  26. }
  27. void vector_3f_times_double(RI_vector_3f *vector, double value){
  28. vector->x *= value;
  29. vector->y *= value;
  30. vector->z *= value;
  31. }
  32. void vector_3f_hadamard(RI_vector_3f *multiplicand, RI_vector_3f multiplicator){
  33. multiplicand->x *= multiplicator.x;
  34. multiplicand->y *= multiplicator.y;
  35. multiplicand->z *= multiplicator.z;
  36. }
  37. void vector_2f_element_wise_add(RI_vector_2f *addend_a, RI_vector_2f addend_b){
  38. addend_a->x += addend_b.x;
  39. addend_a->y += addend_b.y;
  40. }
  41. void vector_3f_element_wise_add(RI_vector_3f *addend_a, RI_vector_3f addend_b){
  42. addend_a->x += addend_b.x;
  43. addend_a->y += addend_b.y;
  44. addend_a->z += addend_b.z;
  45. }
  46. void vector_3f_element_wise_subtract(RI_vector_3f *minuend, RI_vector_3f subtrahend){
  47. minuend->x -= subtrahend.x;
  48. minuend->y -= subtrahend.y;
  49. minuend->z -= subtrahend.z;
  50. }
  51. void vector_3f_divide_double(RI_vector_3f *dividend, double divisor){
  52. dividend->x /= divisor;
  53. dividend->y /= divisor;
  54. dividend->z /= divisor;
  55. }
  56. void quaternion_conjugate(RI_vector_4f* quaternion){
  57. quaternion->x *= -1;
  58. quaternion->y *= -1;
  59. quaternion->z *= -1;
  60. }
  61. void quaternion_multiply(RI_vector_4f* a, RI_vector_4f b){
  62. double w1 = a->w; double x1 = a->x; double y1 = a->y; double z1 = a->z;
  63. double w2 = b.w; double x2 = b.x; double y2 = b.y; double z2 = b.z;
  64. double w = w1*w2 - x1*x2 - y1*y2 - z1*z2;
  65. double x = w1*x2 + x1*w2 + y1*z2 - z1*y2;
  66. double y = w1*y2 - x1*z2 + y1*w2 + z1*x2;
  67. double z = w1*z2 + x1*y2 - y1*x2 + z1*w2;
  68. *a = (RI_vector_4f){w, x, y, z};
  69. }
  70. void vector_2f_lerp(RI_vector_2f vector_a, RI_vector_2f vector_b, RI_vector_2f *result, double w1){
  71. double w0 = 1.0 - w1;
  72. vector_2f_times_double(result, 0);
  73. vector_2f_times_double(&vector_a, w0);
  74. vector_2f_times_double(&vector_b, w1);
  75. vector_2f_element_wise_add(result, vector_a);
  76. vector_2f_element_wise_add(result, vector_b);
  77. }
  78. void vector_3f_lerp(RI_vector_3f vector_a, RI_vector_3f vector_b, RI_vector_3f *result, double w1){
  79. double w0 = 1.0 - w1;
  80. vector_3f_times_double(result, 0);
  81. vector_3f_times_double(&vector_a, w0);
  82. vector_3f_times_double(&vector_b, w1);
  83. vector_3f_element_wise_add(result, vector_a);
  84. vector_3f_element_wise_add(result, vector_b);
  85. }
  86. #endif