2016-01-02 11:13:44 -05:00
|
|
|
#include "engine/douglas_peucker.hpp"
|
2014-10-27 19:16:03 -04:00
|
|
|
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <boost/test/test_case_template.hpp>
|
|
|
|
|
2014-11-24 11:57:01 -05:00
|
|
|
#include <osrm/coordinate.hpp>
|
|
|
|
|
2015-09-03 05:38:35 -04:00
|
|
|
#include <vector>
|
2014-10-27 19:16:03 -04:00
|
|
|
|
2016-01-08 06:55:37 -05:00
|
|
|
BOOST_AUTO_TEST_SUITE(douglas_peucker_simplification)
|
2014-10-27 19:16:03 -04:00
|
|
|
|
2016-01-05 10:51:13 -05:00
|
|
|
using namespace osrm;
|
|
|
|
using namespace osrm::engine;
|
|
|
|
|
2016-01-28 10:28:44 -05:00
|
|
|
BOOST_AUTO_TEST_CASE(removed_middle_test)
|
2014-10-27 19:16:03 -04:00
|
|
|
{
|
|
|
|
/*
|
2016-01-08 06:55:37 -05:00
|
|
|
x
|
|
|
|
/ \
|
|
|
|
x \
|
|
|
|
/ \
|
|
|
|
x x
|
|
|
|
*/
|
2016-02-23 15:23:13 -05:00
|
|
|
std::vector<util::Coordinate> coordinates = {
|
|
|
|
util::Coordinate(util::FloatLongitude(5), util::FloatLatitude(5)),
|
|
|
|
util::Coordinate(util::FloatLongitude(6), util::FloatLatitude(6)),
|
|
|
|
util::Coordinate(util::FloatLongitude(10), util::FloatLatitude(10)),
|
|
|
|
util::Coordinate(util::FloatLongitude(15), util::FloatLatitude(5))};
|
2016-01-28 10:28:44 -05:00
|
|
|
|
|
|
|
// FIXME this test fails for everything below z4 because the DP algorithms
|
|
|
|
// only used a naive distance measurement
|
2016-02-23 15:23:13 -05:00
|
|
|
// for (unsigned z = 0; z < detail::DOUGLAS_PEUCKER_THRESHOLDS_SIZE; z++)
|
2016-01-28 10:28:44 -05:00
|
|
|
for (unsigned z = 0; z < 2; z++)
|
2014-10-27 19:16:03 -04:00
|
|
|
{
|
2016-01-28 10:28:44 -05:00
|
|
|
auto result = douglasPeucker(coordinates, z);
|
|
|
|
BOOST_CHECK_EQUAL(result.size(), 3);
|
|
|
|
BOOST_CHECK_EQUAL(result[0], coordinates[0]);
|
|
|
|
BOOST_CHECK_EQUAL(result[1], coordinates[2]);
|
|
|
|
BOOST_CHECK_EQUAL(result[2], coordinates[3]);
|
2014-10-27 19:16:03 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(remove_second_node_test)
|
|
|
|
{
|
2016-01-08 06:55:37 -05:00
|
|
|
for (unsigned z = 0; z < detail::DOUGLAS_PEUCKER_THRESHOLDS_SIZE; z++)
|
2014-10-27 19:16:03 -04:00
|
|
|
{
|
|
|
|
/*
|
2016-01-08 06:55:37 -05:00
|
|
|
x--x
|
|
|
|
| \
|
|
|
|
x-x x
|
|
|
|
|
|
|
|
|
x
|
|
|
|
*/
|
2016-02-23 15:23:13 -05:00
|
|
|
std::vector<util::Coordinate> input = {
|
|
|
|
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION),
|
|
|
|
util::FixedLatitude(5 * COORDINATE_PRECISION)),
|
|
|
|
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION),
|
|
|
|
util::FixedLatitude(5 * COORDINATE_PRECISION +
|
|
|
|
detail::DOUGLAS_PEUCKER_THRESHOLDS[z])),
|
|
|
|
util::Coordinate(util::FixedLongitude(10 * COORDINATE_PRECISION),
|
|
|
|
util::FixedLatitude(10 * COORDINATE_PRECISION)),
|
|
|
|
util::Coordinate(util::FixedLongitude(10 * COORDINATE_PRECISION),
|
|
|
|
util::FixedLatitude(10 + COORDINATE_PRECISION +
|
|
|
|
detail::DOUGLAS_PEUCKER_THRESHOLDS[z] * 2)),
|
|
|
|
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION),
|
|
|
|
util::FixedLatitude(15 * COORDINATE_PRECISION)),
|
|
|
|
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION +
|
|
|
|
detail::DOUGLAS_PEUCKER_THRESHOLDS[z]),
|
|
|
|
util::FixedLatitude(15 * COORDINATE_PRECISION))};
|
2016-01-08 06:55:37 -05:00
|
|
|
BOOST_TEST_MESSAGE("Threshold (" << z << "): " << detail::DOUGLAS_PEUCKER_THRESHOLDS[z]);
|
2016-01-28 10:28:44 -05:00
|
|
|
auto result = douglasPeucker(input, z);
|
|
|
|
BOOST_CHECK_EQUAL(result.size(), 4);
|
|
|
|
BOOST_CHECK_EQUAL(input[0], result[0]);
|
|
|
|
BOOST_CHECK_EQUAL(input[2], result[1]);
|
|
|
|
BOOST_CHECK_EQUAL(input[3], result[2]);
|
|
|
|
BOOST_CHECK_EQUAL(input[5], result[3]);
|
2014-10-27 19:16:03 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|