diff --git a/include/engine/plugins/match.hpp b/include/engine/plugins/match.hpp index 3dded7b99..bc831cbc3 100644 --- a/include/engine/plugins/match.hpp +++ b/include/engine/plugins/match.hpp @@ -107,9 +107,9 @@ template class MapMatchingPlugin : public BasePlugin if (input_coords.size() - 1 > current_coordinate && 0 < current_coordinate) { - double turn_angle = util::ComputeAngle::OfThreeFixedPointCoordinates( - input_coords[current_coordinate - 1], input_coords[current_coordinate], - input_coords[current_coordinate + 1]); + double turn_angle = util::ComputeAngle(input_coords[current_coordinate - 1], + input_coords[current_coordinate], + input_coords[current_coordinate + 1]); // sharp turns indicate a possible uturn if (turn_angle <= 90.0 || turn_angle >= 270.0) diff --git a/include/util/compute_angle.hpp b/include/util/compute_angle.hpp index 2662ed99e..02313e912 100644 --- a/include/util/compute_angle.hpp +++ b/include/util/compute_angle.hpp @@ -1,21 +1,36 @@ #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 { -struct FixedPointCoordinate; - -struct ComputeAngle +// Get angle of line segment (A,C)->(C,B) +inline double ComputeAngle(const FixedPointCoordinate first, + const FixedPointCoordinate second, + const FixedPointCoordinate third) noexcept { - // Get angle of line segment (A,C)->(C,B) - // atan2 magic, formerly cosine theorem - static double OfThreeFixedPointCoordinates(const FixedPointCoordinate &first, - const FixedPointCoordinate &second, - const FixedPointCoordinate &third) noexcept; -}; + const double v1x = (first.lon - second.lon) / COORDINATE_PRECISION; + const double v1y = mercator::lat2y(first.lat / COORDINATE_PRECISION) - + mercator::lat2y(second.lat / COORDINATE_PRECISION); + const double v2x = (third.lon - second.lon) / COORDINATE_PRECISION; + const double v2y = mercator::lat2y(third.lat / COORDINATE_PRECISION) - + mercator::lat2y(second.lat / COORDINATE_PRECISION); + + double angle = (atan2_lookup(v2y, v2x) - atan2_lookup(v1y, v1x)) * 180. / M_PI; + + while (angle < 0.) + { + angle += 360.; + } + + return angle; +} } } diff --git a/src/extractor/edge_based_graph_factory.cpp b/src/extractor/edge_based_graph_factory.cpp index b26f34fc8..38fc76990 100644 --- a/src/extractor/edge_based_graph_factory.cpp +++ b/src/extractor/edge_based_graph_factory.cpp @@ -468,7 +468,7 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges( ? m_compressed_edge_container.GetFirstEdgeTargetID(e2) : node_w)]; - const double turn_angle = util::ComputeAngle::OfThreeFixedPointCoordinates( + const double turn_angle = util::ComputeAngle( first_coordinate, m_node_info_list[node_v], third_coordinate); const int turn_penalty = GetTurnPenalty(turn_angle, lua_state); diff --git a/src/util/compute_angle.cpp b/src/util/compute_angle.cpp deleted file mode 100644 index ebc2f0f2e..000000000 --- a/src/util/compute_angle.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "util/compute_angle.hpp" - -#include "util/trigonometry_table.hpp" -#include "util/mercator.hpp" - -#include "osrm/coordinate.hpp" - -#include - -namespace osrm -{ -namespace util -{ - -double ComputeAngle::OfThreeFixedPointCoordinates(const FixedPointCoordinate &first, - const FixedPointCoordinate &second, - const FixedPointCoordinate &third) noexcept -{ - const double v1x = (first.lon - second.lon) / COORDINATE_PRECISION; - const double v1y = mercator::lat2y(first.lat / COORDINATE_PRECISION) - - mercator::lat2y(second.lat / COORDINATE_PRECISION); - const double v2x = (third.lon - second.lon) / COORDINATE_PRECISION; - const double v2y = mercator::lat2y(third.lat / COORDINATE_PRECISION) - - mercator::lat2y(second.lat / COORDINATE_PRECISION); - - double angle = (atan2_lookup(v2y, v2x) - atan2_lookup(v1y, v1x)) * 180. / M_PI; - while (angle < 0.) - { - angle += 360.; - } - return angle; -} -} -}