2015-01-27 11:44:46 -05:00
|
|
|
#ifndef COMPUTE_ANGLE_HPP
|
|
|
|
#define COMPUTE_ANGLE_HPP
|
|
|
|
|
2016-01-08 17:08:32 -05:00
|
|
|
#include "osrm/coordinate.hpp"
|
|
|
|
#include "util/trigonometry_table.hpp"
|
|
|
|
#include "util/mercator.hpp"
|
|
|
|
|
2016-01-05 10:51:13 -05:00
|
|
|
namespace osrm
|
|
|
|
{
|
|
|
|
namespace util
|
|
|
|
{
|
|
|
|
|
2016-01-08 17:08:32 -05:00
|
|
|
// Get angle of line segment (A,C)->(C,B)
|
|
|
|
inline double ComputeAngle(const FixedPointCoordinate first,
|
|
|
|
const FixedPointCoordinate second,
|
|
|
|
const FixedPointCoordinate third) noexcept
|
2015-01-27 11:44:46 -05:00
|
|
|
{
|
2016-01-08 17:08:32 -05:00
|
|
|
const double v1x = (first.lon - second.lon) / COORDINATE_PRECISION;
|
2016-01-11 08:06:49 -05:00
|
|
|
const double v1y = mercator::latToY(first.lat / COORDINATE_PRECISION) -
|
|
|
|
mercator::latToY(second.lat / COORDINATE_PRECISION);
|
2016-01-08 17:08:32 -05:00
|
|
|
const double v2x = (third.lon - second.lon) / COORDINATE_PRECISION;
|
2016-01-11 08:06:49 -05:00
|
|
|
const double v2y = mercator::latToY(third.lat / COORDINATE_PRECISION) -
|
|
|
|
mercator::latToY(second.lat / COORDINATE_PRECISION);
|
2016-01-08 17:08:32 -05:00
|
|
|
|
|
|
|
double angle = (atan2_lookup(v2y, v2x) - atan2_lookup(v1y, v1x)) * 180. / M_PI;
|
|
|
|
|
|
|
|
while (angle < 0.)
|
|
|
|
{
|
|
|
|
angle += 360.;
|
|
|
|
}
|
|
|
|
|
|
|
|
return angle;
|
|
|
|
}
|
2016-01-05 10:51:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-27 11:44:46 -05:00
|
|
|
#endif // COMPUTE_ANGLE_HPP
|