Vector2.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #include "Vector2.hpp"
  2. #include <cmath>
  3. #include <godot/godot_vector2.h>
  4. #include "String.hpp"
  5. namespace godot {
  6. Vector2 Vector2::operator+(const Vector2& p_v) const
  7. {
  8. return Vector2(x + p_v.x, y + p_v.y);
  9. }
  10. void Vector2::operator+=(const Vector2& p_v)
  11. {
  12. x += p_v.x;
  13. y += p_v.y;
  14. }
  15. Vector2 Vector2::operator-(const Vector2& p_v) const
  16. {
  17. return Vector2(x - p_v.x, y - p_v.y);
  18. }
  19. void Vector2::operator-=(const Vector2& p_v)
  20. {
  21. x -= p_v.x;
  22. y -= p_v.y;
  23. }
  24. Vector2 Vector2::operator*(const Vector2 &p_v1) const
  25. {
  26. return Vector2(x * p_v1.x, y * p_v1.y);
  27. }
  28. Vector2 Vector2::operator*(const real_t &rvalue) const
  29. {
  30. return Vector2(x * rvalue, y * rvalue);
  31. }
  32. void Vector2::operator*=(const real_t &rvalue)
  33. {
  34. x *= rvalue;
  35. y *= rvalue;
  36. }
  37. Vector2 Vector2::operator/(const Vector2 &p_v1) const
  38. {
  39. return Vector2(x / p_v1.x, y / p_v1.y);
  40. }
  41. Vector2 Vector2::operator/(const real_t &rvalue) const
  42. {
  43. return Vector2(x / rvalue, y / rvalue);
  44. }
  45. void Vector2::operator/=(const real_t &rvalue)
  46. {
  47. x /= rvalue;
  48. y /= rvalue;
  49. }
  50. Vector2 Vector2::operator-() const
  51. {
  52. return Vector2(-x, -y);
  53. }
  54. bool Vector2::operator==(const Vector2& p_vec2) const
  55. {
  56. return x == p_vec2.x && y == p_vec2.y;
  57. }
  58. bool Vector2::operator!=(const Vector2& p_vec2) const
  59. {
  60. return x != p_vec2.x || y != p_vec2.y;
  61. }
  62. void Vector2::normalize()
  63. {
  64. real_t l = x*x + y*y;
  65. if (l != 0) {
  66. l = (l);
  67. x /= l;
  68. y /= l;
  69. }
  70. }
  71. Vector2 Vector2::normalized() const
  72. {
  73. Vector2 v = *this;
  74. v.normalize();
  75. return v;
  76. }
  77. real_t Vector2::length() const
  78. {
  79. return sqrt(x*x + y*y);
  80. }
  81. real_t Vector2::length_squared() const
  82. {
  83. return x*x + y*y;
  84. }
  85. real_t Vector2::distance_to(const Vector2& p_vector2) const
  86. {
  87. return sqrt((x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y));
  88. }
  89. real_t Vector2::distance_squared_to(const Vector2& p_vector2) const
  90. {
  91. return (x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y);
  92. }
  93. real_t Vector2::angle_to(const Vector2& p_vector2) const
  94. {
  95. return atan2(cross(p_vector2), dot(p_vector2));
  96. }
  97. real_t Vector2::angle_to_point(const Vector2& p_vector2) const
  98. {
  99. return atan2(y - p_vector2.y, x-p_vector2.x);
  100. }
  101. real_t Vector2::dot(const Vector2& p_other) const
  102. {
  103. return x * p_other.x + y * p_other.y;
  104. }
  105. real_t Vector2::cross(const Vector2& p_other) const
  106. {
  107. return x * p_other.y - y * p_other.x;
  108. }
  109. Vector2 Vector2::cross(real_t p_other) const
  110. {
  111. return Vector2(p_other * y, -p_other * x);
  112. }
  113. Vector2 Vector2::project(const Vector2& p_vec) const
  114. {
  115. Vector2 v1 = p_vec;
  116. Vector2 v2 = *this;
  117. return v2 * (v1.dot(v2) / v2.dot(v2));
  118. }
  119. Vector2 Vector2::plane_project(real_t p_d, const Vector2& p_vec) const
  120. {
  121. return p_vec - *this * ( dot(p_vec) -p_d);
  122. }
  123. Vector2 Vector2::clamped(real_t p_len) const
  124. {
  125. real_t l = length();
  126. Vector2 v = *this;
  127. if (l > 0 && p_len < l) {
  128. v /= l;
  129. v *= p_len;
  130. }
  131. return v;
  132. }
  133. Vector2 Vector2::linear_interpolate(const Vector2& p_a, const Vector2& p_b,real_t p_t)
  134. {
  135. Vector2 res=p_a;
  136. res.x+= (p_t * (p_b.x-p_a.x));
  137. res.y+= (p_t * (p_b.y-p_a.y));
  138. return res;
  139. }
  140. Vector2 Vector2::linear_interpolate(const Vector2& p_b,real_t p_t) const
  141. {
  142. Vector2 res=*this;
  143. res.x+= (p_t * (p_b.x-x));
  144. res.y+= (p_t * (p_b.y-y));
  145. return res;
  146. }
  147. Vector2 Vector2::cubic_interpolate(const Vector2& p_b,const Vector2& p_pre_a, const Vector2& p_post_b,real_t p_t) const
  148. {
  149. Vector2 p0=p_pre_a;
  150. Vector2 p1=*this;
  151. Vector2 p2=p_b;
  152. Vector2 p3=p_post_b;
  153. real_t t = p_t;
  154. real_t t2 = t * t;
  155. real_t t3 = t2 * t;
  156. Vector2 out;
  157. out = ( ( p1 * 2.0) +
  158. ( -p0 + p2 ) * t +
  159. ( p0 * 2.0 - p1 * 5.0 + p2 * 4 - p3 ) * t2 +
  160. ( -p0 + p1 * 3.0 - p2 * 3.0 + p3 ) * t3 ) * 0.5;
  161. return out;
  162. }
  163. Vector2 Vector2::slide(const Vector2& p_vec) const
  164. {
  165. return p_vec - *this * this->dot(p_vec);
  166. }
  167. Vector2 Vector2::reflect(const Vector2& p_vec) const
  168. {
  169. return p_vec - *this * this->dot(p_vec) * 2.0;
  170. }
  171. real_t Vector2::angle() const
  172. {
  173. return atan2(y, x);
  174. }
  175. void Vector2::set_rotation(real_t p_radians) {
  176. x = cosf(p_radians);
  177. y = sinf(p_radians);
  178. }
  179. Vector2 Vector2::abs() const {
  180. return Vector2( fabs(x), fabs(y) );
  181. }
  182. Vector2 Vector2::rotated(real_t p_by) const
  183. {
  184. Vector2 v;
  185. v.set_rotation(angle() + p_by);
  186. v *= length();
  187. return v;
  188. }
  189. Vector2 Vector2::tangent() const {
  190. return Vector2(y,-x);
  191. }
  192. Vector2 Vector2::floor() const
  193. {
  194. return Vector2(::floor(x), ::floor(y));
  195. }
  196. Vector2 Vector2::snapped(const Vector2& p_by) const
  197. {
  198. return Vector2(
  199. p_by.x != 0 ? ::floor(x / p_by.x + 0.5) * p_by.x : x,
  200. p_by.y != 0 ? ::floor(y / p_by.y + 0.5) * p_by.y : y
  201. );
  202. }
  203. Vector2::operator String() const
  204. {
  205. return String(); /* @Todo String::num() */
  206. }
  207. }