diff options
author | Sergey Magidovich <mgsergio@mapswithme.com> | 2015-12-07 13:52:56 +0300 |
---|---|---|
committer | Sergey Magidovich <mgsergio@mapswithme.com> | 2015-12-07 15:15:49 +0300 |
commit | 82e7d98a29001ce941f080a716a1054a1876fdf6 (patch) | |
tree | aa18c287e01fc11e241641f69e3e073e261dfb47 /geometry/geometry_tests | |
parent | 650c1e5aa448e31028304a6f7cf382a580c333b4 (diff) |
Move mercator.hpp to geometry.
Diffstat (limited to 'geometry/geometry_tests')
-rw-r--r-- | geometry/geometry_tests/geometry_tests.pro | 5 | ||||
-rw-r--r-- | geometry/geometry_tests/latlon_test.cpp | 2 | ||||
-rw-r--r-- | geometry/geometry_tests/mercator_test.cpp | 85 |
3 files changed, 88 insertions, 4 deletions
diff --git a/geometry/geometry_tests/geometry_tests.pro b/geometry/geometry_tests/geometry_tests.pro index 8ad7164d13..3f5bd05170 100644 --- a/geometry/geometry_tests/geometry_tests.pro +++ b/geometry/geometry_tests/geometry_tests.pro @@ -6,9 +6,7 @@ CONFIG -= app_bundle TEMPLATE = app ROOT_DIR = ../.. -# TODO(AlexZ): latlon.hpp introduces indexer dependency for tests, -# because of indexer/mercator.hpp. Either move latlon to indexer, or mercator to geometry. -DEPENDENCIES = indexer geometry base +DEPENDENCIES = geometry base include($$ROOT_DIR/common.pri) @@ -28,6 +26,7 @@ SOURCES += \ distance_test.cpp \ intersect_test.cpp \ latlon_test.cpp \ + mercator_test.cpp \ packer_test.cpp \ point_test.cpp \ pointu_to_uint64_test.cpp \ diff --git a/geometry/geometry_tests/latlon_test.cpp b/geometry/geometry_tests/latlon_test.cpp index e57cbbbd32..5242c8a2ba 100644 --- a/geometry/geometry_tests/latlon_test.cpp +++ b/geometry/geometry_tests/latlon_test.cpp @@ -1,7 +1,7 @@ #include "testing/testing.hpp" #include "geometry/latlon.hpp" #include "geometry/point2d.hpp" -#include "indexer/mercator.hpp" +#include "geometry/mercator.hpp" UNIT_TEST(LatLonPointConstructorTest) { diff --git a/geometry/geometry_tests/mercator_test.cpp b/geometry/geometry_tests/mercator_test.cpp new file mode 100644 index 0000000000..add1f33929 --- /dev/null +++ b/geometry/geometry_tests/mercator_test.cpp @@ -0,0 +1,85 @@ +#include "base/SRC_FIRST.hpp" + +#include "testing/testing.hpp" + +#include "geometry/mercator.hpp" + +#include "base/math.hpp" +#include "base/macros.hpp" +#include "base/logging.hpp" + + +UNIT_TEST(Mercator_Grid) +{ + for (int lat = -85; lat <= 85; ++lat) + { + for (int lon = -180; lon <= 180; ++lon) + { + double const x = MercatorBounds::LonToX(lon); + double const y = MercatorBounds::LatToY(lat); + double const lat1 = MercatorBounds::YToLat(y); + double const lon1 = MercatorBounds::XToLon(x); + + // Normal assumption for any projection. + TEST_ALMOST_EQUAL_ULPS(static_cast<double>(lat), lat1, ()); + TEST_ALMOST_EQUAL_ULPS(static_cast<double>(lon), lon1, ()); + + // x is actually lon unmodified. + TEST_ALMOST_EQUAL_ULPS(x, static_cast<double>(lon), ()); + } + } +} + +UNIT_TEST(Mercator_DirectInferseF) +{ + double const eps = 0.0000001; + double lon = 63.45421; + double x = MercatorBounds::LonToX(lon); + double lon1 = MercatorBounds::XToLon(x); + TEST_LESS(fabs(lon - lon1), eps, ("Too big round error")); + double lat = 34.28754; + double y = MercatorBounds::LatToY(lat); + double lat1 = MercatorBounds::YToLat(y); + TEST_LESS(fabs(lat - lat1), eps, ("Too big round error")); + TEST_LESS(fabs(MercatorBounds::maxX - MercatorBounds::maxY), eps, ("Non-square maxX and maxY")); + TEST_LESS(fabs(MercatorBounds::minX - MercatorBounds::minY), eps, ("Non-square minX and minY")); +} + +UNIT_TEST(Mercator_ErrorToRadius) +{ + double const points[] = { -85.0, -45.0, -10.0, -1.0, -0.003, 0.0, 0.003, 1.0, 10.0, 45.0, 85.0 }; + + double const error1 = 1.0; // 1 metre + double const error10 = 10.0; // 10 metres + + for (size_t i = 0; i < ARRAY_SIZE(points); ++i) + { + for (size_t j = 0; j < ARRAY_SIZE(points); ++j) + { + double const lon = points[i]; + double const lat = points[j]; + m2::PointD const mercPoint(MercatorBounds::LonToX(lon), MercatorBounds::LatToY(lat)); + + m2::RectD const radius1 = MercatorBounds::MetresToXY(lon, lat, error1); + TEST(radius1.IsPointInside(mercPoint), (lat, lon)); + TEST(radius1.Center().EqualDxDy(mercPoint, 1.0E-8), ()); + + m2::RectD const radius10 = MercatorBounds::MetresToXY(lon, lat, error10); + TEST(radius10.IsPointInside(mercPoint), (lat, lon)); + TEST(radius10.Center().EqualDxDy(mercPoint, 1.0E-8), ()); + + TEST_EQUAL(m2::Add(radius10, radius1), radius10, (lat, lon)); + + TEST(radius10.IsPointInside(radius1.LeftTop()), (lat, lon)); + TEST(radius10.IsPointInside(radius1.LeftBottom()), (lat, lon)); + TEST(radius10.IsPointInside(radius1.RightTop()), (lat, lon)); + TEST(radius10.IsPointInside(radius1.RightBottom()), (lat, lon)); + } + } +} + +UNIT_TEST(Mercator_Sample1) +{ + LOG(LINFO, (MercatorBounds::XToLon(27.531491200000001385), + MercatorBounds::YToLat(64.392864299248202542))); +} |