vector.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. /* ---------------------------------------------- 3D Vectors operations --------------------------------------------- */
  27. double vec3Getlength(vec3_t v)
  28. {
  29. return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
  30. }
  31. vec3_t vec3AddVectors(vec3_t a, vec3_t b)
  32. {
  33. vec3_t ret = { a.x + b.x, a.y + b.y , a.z + b.z };
  34. return ret;
  35. }
  36. vec3_t vec3SubVectors(vec3_t a, vec3_t b)
  37. {
  38. vec3_t ret = { a.x - b.x, a.y - b.y , a.z - b.z };
  39. return ret;
  40. }
  41. vec3_t vec3RotateX(vec3_t original, double angle)
  42. {
  43. vec3_t ret = {
  44. .x = original.x,
  45. .y = original.y * cos(angle) - original.z * sin(angle),
  46. .z = original.y * sin(angle) + original.z * cos(angle)
  47. };
  48. return ret;
  49. }
  50. vec3_t vec3RotateY(vec3_t original, double angle)
  51. {
  52. vec3_t ret = {
  53. .x = original.x * cos(angle) - original.z * sin(angle),
  54. .y = original.y,
  55. .z = original.x * sin(angle) + original.z * cos(angle)
  56. };
  57. return ret;
  58. }
  59. vec3_t vec3RotateZ(vec3_t original, double angle)
  60. {
  61. vec3_t ret = {
  62. .x = original.x * cos(angle) - original.y * sin(angle),
  63. .y = original.x * sin(angle) + original.y * cos(angle),
  64. .z = original.z,
  65. };
  66. return ret;
  67. }