From 665dc21283165c2efec23c9815238648607cd3eb Mon Sep 17 00:00:00 2001 From: vng Date: Mon, 6 Jun 2011 22:05:26 +0300 Subject: [PATCH] GetRationForLevel, GetRectForLevel implementation. --- indexer/indexer_tests/indexer_tests.pro | 1 + indexer/indexer_tests/scales_test.cpp | 19 +++++++++++++++++++ indexer/scales.cpp | 21 +++++++++++++++++++++ indexer/scales.hpp | 6 ++++-- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 indexer/indexer_tests/scales_test.cpp diff --git a/indexer/indexer_tests/indexer_tests.pro b/indexer/indexer_tests/indexer_tests.pro index b1db0227e9..253c046db1 100644 --- a/indexer/indexer_tests/indexer_tests.pro +++ b/indexer/indexer_tests/indexer_tests.pro @@ -32,3 +32,4 @@ SOURCES += \ geometry_coding_test.cpp \ triangles_tree_coding_test.cpp \ feature_routine.cpp \ + scales_test.cpp \ diff --git a/indexer/indexer_tests/scales_test.cpp b/indexer/indexer_tests/scales_test.cpp new file mode 100644 index 0000000000..f070730973 --- /dev/null +++ b/indexer/indexer_tests/scales_test.cpp @@ -0,0 +1,19 @@ +#include "../../testing/testing.hpp" +#include "../scales.hpp" + + +using namespace scales; + +UNIT_TEST(ScaleLevel_Smoke) +{ + for (int level = 1; level < GetUpperScale(); ++level) + { + double const d = GetRationForLevel(level); + int test = GetScaleLevel(d); + TEST_EQUAL(level, test, ()); + + m2::RectD const r = GetRectForLevel(level, m2::PointD(0.0, 0.0), 2.0); + test = GetScaleLevel(r); + TEST_EQUAL(level, test, ()); + } +} \ No newline at end of file diff --git a/indexer/scales.cpp b/indexer/scales.cpp index 978698663e..b4e08a1f66 100644 --- a/indexer/scales.cpp +++ b/indexer/scales.cpp @@ -41,6 +41,27 @@ namespace scales return GetScaleLevel((dx + dy) / 2.0); } + double GetRationForLevel(int level) + { + if (level < initial_level) level = initial_level; + return pow(2.0, level - initial_level); + } + + m2::RectD GetRectForLevel(int level, m2::PointD const & center, double X2YRatio) + { + double const dy = 2.0*GetRationForLevel(level) / (1.0 + X2YRatio); + double const dx = X2YRatio * dy; + ASSERT_GREATER ( dy, 0.0, () ); + ASSERT_GREATER ( dx, 0.0, () ); + + double const xL = (MercatorBounds::maxX - MercatorBounds::minX) / (2.0*dx); + double const yL = (MercatorBounds::maxY - MercatorBounds::minY) / (2.0*dy); + ASSERT_GREATER ( xL, 0.0, () ); + ASSERT_GREATER ( yL, 0.0, () ); + + return m2::RectD(center.x - xL, center.y - yL, center.x + xL, center.y + yL); + } + namespace { double GetEpsilonImpl(int level, int logEps) diff --git a/indexer/scales.hpp b/indexer/scales.hpp index 96c13e4d40..e09124ddbe 100644 --- a/indexer/scales.hpp +++ b/indexer/scales.hpp @@ -10,11 +10,13 @@ namespace scales double GetM2PFactor(int level); int GetScaleLevel(double ratio); + int GetScaleLevel(m2::RectD const & r); + /// @return such ration, that GetScaleLevel(ration) == level double GetRationForLevel(int level); - int GetScaleLevel(m2::RectD const & r); /// @return such rect, that GetScaleLevel(rect) == level - m2::RectD GetRectForLevel(int level, m2::PointD const & center, double widthToHeightRatio); + m2::RectD GetRectForLevel(int level, m2::PointD const & center, double X2YRatio); + double GetEpsilonForLevel(int level); double GetEpsilonForSimplify(int level); bool IsGoodForLevel(int level, m2::RectD const & r);