refactor merging of segregated roads

adjust to generalFindMaximum function
moved parallel detection to ratio/absolute based regression testing
considerably improved detection quality using normalised regression lines
only follow initial direction/narrow turns for parallel detection
This commit is contained in:
Moritz Kobitzsch
2016-12-06 13:22:51 +01:00
parent f7ad2e1e26
commit e6ff17ab2a
40 changed files with 2397 additions and 949 deletions
@@ -1,6 +1,7 @@
#include <boost/numeric/conversion/cast.hpp>
#include <boost/test/unit_test.hpp>
#include "util/bearing.hpp"
#include "util/coordinate_calculation.hpp"
#include <osrm/coordinate.hpp>
@@ -325,4 +326,56 @@ BOOST_AUTO_TEST_CASE(squaredEuclideanDistance)
BOOST_CHECK_EQUAL(result, 162000000000000000ull);
}
BOOST_AUTO_TEST_CASE(vertical_regression)
{
// check a vertical line for its bearing
std::vector<Coordinate> coordinates;
for (std::size_t i = 0; i < 100; ++i)
coordinates.push_back(Coordinate(FloatLongitude{0.0}, FloatLatitude{i / 100.0}));
const auto regression =
util::coordinate_calculation::leastSquareRegression(coordinates.begin(), coordinates.end());
const auto is_valid =
util::angularDeviation(
util::coordinate_calculation::bearing(regression.first, regression.second), 0) < 2;
BOOST_CHECK(is_valid);
}
BOOST_AUTO_TEST_CASE(sinus_curve)
{
// create a full sinus curve, sampled in 3.6 degree
std::vector<Coordinate> coordinates;
for (std::size_t i = 0; i < 360; ++i)
coordinates.push_back(Coordinate(
FloatLongitude{i / 360.0},
FloatLatitude{sin(util::coordinate_calculation::detail::degToRad(i / 360.0))}));
const auto regression =
util::coordinate_calculation::leastSquareRegression(coordinates.begin(), coordinates.end());
const auto is_valid =
util::angularDeviation(
util::coordinate_calculation::bearing(regression.first, regression.second), 90) < 2;
BOOST_CHECK(is_valid);
}
BOOST_AUTO_TEST_CASE(parallel_lines_slight_offset)
{
std::vector<Coordinate> coordinates_lhs;
for (std::size_t i = 0; i < 100; ++i)
coordinates_lhs.push_back(Coordinate(util::FloatLongitude{(50 - (rand() % 101)) / 100000.0},
util::FloatLatitude{i / 100000.0}));
std::vector<Coordinate> coordinates_rhs;
for (std::size_t i = 0; i < 100; ++i)
coordinates_rhs.push_back(
Coordinate(util::FloatLongitude{(150 - (rand() % 101)) / 100000.0},
util::FloatLatitude{i / 100000.0}));
const auto are_parallel = util::coordinate_calculation::areParallel(coordinates_lhs.begin(),
coordinates_lhs.end(),
coordinates_rhs.begin(),
coordinates_rhs.end());
BOOST_CHECK(are_parallel);
}
BOOST_AUTO_TEST_SUITE_END()