Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <cmath>
- struct Vec2
- {
- double x = 0.;
- double y = 0.;
- };
- double cos_(double rw)
- {
- return(cos((rw*M_PI) / 180.));
- }
- double sin_(double rw)
- {
- return(sin((rw*M_PI) / 180.));
- }
- double atan1_(double y, double x)
- {
- double rw, eps = 0.0001;
- if ((x > -eps) && (x < eps)) {
- if ((y > -eps) && (y < eps)) rw = 0.;
- else if (y > 0.) rw = 90.;
- else if (y < 0.) rw = -90.;
- }
- else {
- rw = atan(y / x)*180. / M_PI;
- if ((y >= 0.) && (x < 0.)) { rw = rw + 180.; }
- else if ((y < 0.) && (x < 0.)) { rw = rw - 180.; }
- }
- return(rw);
- }
- double AngleX(const Vec2 &aVec) {
- double ret = atan1_(aVec.y, aVec.x);
- if (ret < 0.)
- ret += 360.;
- if (ret > 360.)
- ret -= 360.;
- return ret;
- }
- double AngleBetween(const Vec2 &aV1, const Vec2 &aV2) {
- double a1 = AngleX(aV1);
- double a2 = AngleX(aV2);
- if (a2 < a1) // ensure non-negative ccw angle
- a2 += 360.;
- double ret = a2 - a1;
- return ret;
- }
- Vec2 AngleToDir(const double aAngle)
- {
- return {cos_(aAngle), sin_(aAngle)};
- }
- void doAndPrint(double x, double y) {
- std::cout << "AngleX(" << y << "," << x << "): " << AngleX({x,y}) << std::endl;
- }
- void doAngleBetween(const Vec2 &aV1, const Vec2 &aV2) {
- std::cout << "AngleBetween( (" << aV1.x << ", " << aV1.y << "), (" << aV2.x << ", " << aV2.y << ") = " << AngleBetween(aV1, aV2) << std::endl;
- }
- void doAngleToDir(const double aAngle) {
- Vec2 a = AngleToDir(aAngle);
- std::cout << "AngleToDir("<<aAngle<<") = ("<< a.x << ", "<<a.y<<")"<<std::endl;
- }
- int main()
- {
- doAngleBetween({0.,-1.}, {-1., 1.});
- doAngleBetween({-1., 1.}, {0.,-1.});
- doAngleBetween({1., -1.}, {1.,1.});
- doAngleBetween({1.,1.}, {1., -1.});
- doAngleToDir(0.);
- doAngleToDir(45.);
- doAngleToDir(90.);
- doAngleToDir(135.);
- doAngleToDir(180.);
- doAngleToDir(225.);
- doAngleToDir(270.);
- doAngleToDir(315.);
- doAngleToDir(360.);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement