math_utils.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #pragma once
  2. #include "math/box2d.h"
  3. #include "math/polygon2d.h"
  4. #include "math/vec2d.h"
  5. #include "math/vec3d.h"
  6. namespace decision::math {
  7. constexpr double kMathEpsilon = 1e-10;
  8. inline double cross_prod(const Vec2d& point1, const Vec2d& point2, const Vec2d& point3)
  9. {
  10. return (point2.x() - point1.x()) * (point3.y() - point1.y()) - (point3.x() - point1.x()) * (point2.y() - point1.y());
  11. }
  12. inline Vec3d cross_prod(const Vec3d& point1, const Vec3d& point2, const Vec3d& point3)
  13. {
  14. Vec3d v12 = point2 - point1;
  15. Vec3d v13 = point3 - point1;
  16. return v12.cross_prod(v13);
  17. }
  18. inline double inner_prod(const Vec2d& point1, const Vec2d& point2, const Vec2d& point3)
  19. {
  20. return (point2.x() - point1.x()) * (point3.x() - point1.x()) + (point2.y() - point1.y()) * (point3.y() - point1.y());
  21. }
  22. // Wrap angle to [0, 2 * PI).
  23. inline double wrap_angle(const double angle)
  24. {
  25. const double new_angle = fmod(angle, M_PI * 2.0);
  26. return new_angle < 0 ? new_angle + M_PI * 2.0 : new_angle;
  27. }
  28. // Normalize angle to [-PI, PI).
  29. inline double normalize_angle(const double angle)
  30. {
  31. const double new_angle = fmod(angle + M_PI, M_PI * 2.0);
  32. return (new_angle < 0 ? new_angle + M_PI * 2.0 : new_angle) - M_PI;
  33. }
  34. template <typename T>
  35. inline T sqr(const T value)
  36. {
  37. return value * value;
  38. }
  39. }
  40. #include <iostream>
  41. #define CHECK(v) (void)(v)
  42. #define CHECK_NOTNULL(v) (void)(v)
  43. #define CHECK_GE(a, b)
  44. #define CHECK_GT(a, b)