Advertisement
markoczy

Untitled

Jun 21st, 2022 (edited)
790
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4.  
  5. struct Vec2
  6. {
  7.   double x = 0.;
  8.   double y = 0.;
  9. };
  10.  
  11.   double cos_(double rw)
  12.   {
  13.     return(cos((rw*M_PI) / 180.));
  14.   }
  15.  
  16.   double sin_(double rw)
  17.   {
  18.     return(sin((rw*M_PI) / 180.));
  19.   }
  20.  
  21. double atan1_(double y, double x)
  22. {
  23.   double rw, eps = 0.0001;
  24.   if ((x > -eps) && (x < eps)) {
  25.     if ((y > -eps) && (y < eps)) rw = 0.;
  26.     else if (y > 0.) rw = 90.;
  27.     else if (y < 0.) rw = -90.;
  28.   }
  29.   else {
  30.     rw = atan(y / x)*180. / M_PI;
  31.     if ((y >= 0.) && (x < 0.)) { rw = rw + 180.; }
  32.     else if ((y < 0.) && (x < 0.)) { rw = rw - 180.; }
  33.   }
  34.   return(rw);
  35. }
  36.  
  37. double AngleX(const Vec2 &aVec) {
  38.     double ret = atan1_(aVec.y, aVec.x);
  39.     if (ret < 0.)
  40.         ret += 360.;
  41.     if (ret > 360.)
  42.         ret -= 360.;
  43.     return ret;
  44. }
  45.  
  46. double AngleBetween(const Vec2 &aV1, const Vec2 &aV2) {
  47.     double a1 = AngleX(aV1);
  48.     double a2 = AngleX(aV2);
  49.     if (a2 < a1) // ensure non-negative ccw angle
  50.         a2 += 360.;
  51.     double ret = a2 - a1;
  52.     return ret;
  53. }
  54.  
  55. Vec2 AngleToDir(const double aAngle)
  56. {
  57.   return {cos_(aAngle), sin_(aAngle)};
  58. }
  59.  
  60. void doAndPrint(double x, double y) {
  61.     std::cout << "AngleX(" << y << "," << x << "): " << AngleX({x,y}) << std::endl;
  62. }
  63.  
  64. void doAngleBetween(const Vec2 &aV1, const Vec2 &aV2) {
  65.     std::cout << "AngleBetween( (" << aV1.x << ", " << aV1.y << "), (" << aV2.x << ", " << aV2.y << ") = " << AngleBetween(aV1, aV2) << std::endl;
  66. }
  67.  
  68.  
  69. void doAngleToDir(const double aAngle) {
  70.     Vec2 a = AngleToDir(aAngle);
  71.     std::cout << "AngleToDir("<<aAngle<<") = ("<< a.x << ", "<<a.y<<")"<<std::endl;
  72. }
  73.  
  74.  
  75. int main()
  76. {
  77.     doAngleBetween({0.,-1.}, {-1., 1.});
  78.     doAngleBetween({-1., 1.}, {0.,-1.});
  79.    
  80.     doAngleBetween({1., -1.}, {1.,1.});
  81.     doAngleBetween({1.,1.}, {1., -1.});
  82.  
  83.     doAngleToDir(0.);
  84.     doAngleToDir(45.);
  85.     doAngleToDir(90.);
  86.     doAngleToDir(135.);
  87.     doAngleToDir(180.);
  88.     doAngleToDir(225.);
  89.     doAngleToDir(270.);
  90.     doAngleToDir(315.);
  91.     doAngleToDir(360.);
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement