#ifndef COMPUTE_ANGLE_HPP #define COMPUTE_ANGLE_HPP #include "osrm/coordinate.hpp" #include "util/trigonometry_table.hpp" #include "util/mercator.hpp" namespace osrm { namespace util { // Get angle of line segment (A,C)->(C,B) inline double ComputeAngle(const FixedPointCoordinate first, const FixedPointCoordinate second, const FixedPointCoordinate third) noexcept { const double v1x = (first.lon - second.lon) / COORDINATE_PRECISION; const double v1y = mercator::latToY(first.lat / COORDINATE_PRECISION) - mercator::latToY(second.lat / COORDINATE_PRECISION); const double v2x = (third.lon - second.lon) / COORDINATE_PRECISION; const double v2y = mercator::latToY(third.lat / COORDINATE_PRECISION) - mercator::latToY(second.lat / COORDINATE_PRECISION); double angle = (atan2_lookup(v2y, v2x) - atan2_lookup(v1y, v1x)) * 180. / M_PI; while (angle < 0.) { angle += 360.; } return angle; } } } #endif // COMPUTE_ANGLE_HPP