vector.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. * 3D Engine
  3. * vector.c:
  4. * Based on pikuma.com 3D software renderer in C
  5. * Copyright (c) 2021 986-Studio. All rights reserved.
  6. *
  7. * Created by Manoël Trapier on 02/03/2021.
  8. */
  9. #include <vector.h>
  10. #include <math.h>
  11. /* ---------------------------------------------- 2D Vectors operations --------------------------------------------- */
  12. double vec2Getlength(vec2_t v)
  13. {
  14. return sqrt(v.x * v.x + v.y * v.y);
  15. }
  16. vec2_t vec2AddVectors(vec2_t a, vec2_t b)
  17. {
  18. vec2_t ret = { a.x + b.x, a.y + b.y};
  19. return ret;
  20. }
  21. vec2_t vec2SubVectors(vec2_t a, vec2_t b)
  22. {
  23. vec2_t ret = { a.x - b.x, a.y - b.y};
  24. return ret;
  25. }
  26. vec2_t vec2ScalarMult(vec2_t a, double s)
  27. {
  28. vec2_t ret = { a.x * s, a.y * s };
  29. return ret;
  30. }
  31. vec2_t vec2ScalarDiv(vec2_t a, double s)
  32. {
  33. vec2_t ret = { a.x / s, a.y / s};
  34. return ret;
  35. }
  36. double vec2Dot(vec2_t a, vec2_t b)
  37. {
  38. return a.x * b.x + a.y * b.y;
  39. }
  40. void vec2Normalize(vec2_t *a)
  41. {
  42. double length = vec2Getlength(*a);
  43. *a = vec2ScalarDiv(*a, length);
  44. }
  45. vec2_t vec2FromVec4(vec4_t v)
  46. {
  47. vec2_t ret = { v.x, v.y };
  48. return ret;
  49. }
  50. /* ---------------------------------------------- 3D Vectors operations --------------------------------------------- */
  51. double vec3Getlength(vec3_t v)
  52. {
  53. return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
  54. }
  55. vec3_t vec3AddVectors(vec3_t a, vec3_t b)
  56. {
  57. vec3_t ret = { a.x + b.x, a.y + b.y , a.z + b.z };
  58. return ret;
  59. }
  60. vec3_t vec3SubVectors(vec3_t a, vec3_t b)
  61. {
  62. vec3_t ret = { a.x - b.x, a.y - b.y , a.z - b.z };
  63. return ret;
  64. }
  65. vec3_t vec3ScalarMult(vec3_t a, double s)
  66. {
  67. vec3_t ret = { a.x * s, a.y * s, a.z * s};
  68. return ret;
  69. }
  70. vec3_t vec3ScalarDiv(vec3_t a, double s)
  71. {
  72. vec3_t ret = { a.x / s, a.y / s, a.z / s};
  73. return ret;
  74. }
  75. vec3_t vec3Cross(vec3_t a, vec3_t b)
  76. {
  77. vec3_t ret =
  78. {
  79. .x = a.y * b.z - a.z * b.y,
  80. .y = a.z * b.x - a.x * b.z,
  81. .z = a.x * b.y - a.y * b.x,
  82. };
  83. return ret;
  84. }
  85. double vec3Dot(vec3_t a, vec3_t b)
  86. {
  87. return a.x * b.x + a.y * b.y + a.z * b.z;
  88. }
  89. void vec3Normalize(vec3_t *a)
  90. {
  91. double length = vec3Getlength(*a);
  92. *a = vec3ScalarDiv(*a, length);
  93. }
  94. vec3_t vec3RotateX(vec3_t original, double angle)
  95. {
  96. vec3_t ret = {
  97. .x = original.x,
  98. .y = original.y * cos(angle) - original.z * sin(angle),
  99. .z = original.y * sin(angle) + original.z * cos(angle)
  100. };
  101. return ret;
  102. }
  103. vec3_t vec3RotateY(vec3_t original, double angle)
  104. {
  105. vec3_t ret = {
  106. .x = original.x * cos(angle) + original.z * sin(angle),
  107. .y = original.y,
  108. .z = -original.x * sin(angle) + original.z * cos(angle)
  109. };
  110. return ret;
  111. }
  112. vec3_t vec3RotateZ(vec3_t original, double angle)
  113. {
  114. vec3_t ret = {
  115. .x = original.x * cos(angle) - original.y * sin(angle),
  116. .y = original.x * sin(angle) + original.y * cos(angle),
  117. .z = original.z,
  118. };
  119. return ret;
  120. }
  121. /* ---------------------------------------------- 4D Vectors operations --------------------------------------------- */
  122. vec4_t vec4FromVec3(vec3_t v)
  123. {
  124. vec4_t ret = { v.x, v.y, v.z, 1 };
  125. return ret;
  126. }