Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Pimenov <m@maps.me>2018-11-26 16:44:37 +0300
committerMaksim Andrianov <maksimandrianov1@gmail.com>2018-11-26 19:11:42 +0300
commit356ac180326847a73985d69938e7baaef02882c1 (patch)
treecd81c771122a799b1c982bc28d7dd8b87d2aad4a /geometry
parent9744c0c04170b07bc848611b8cca7358d3f057bb (diff)
[coding] Removed the CellId epsilon.
In was used as eps in meters in some cases and eps in mercator in others. Its value was hard to justify and so were its use cases. We're better off with less epsilons for now. Also renamed Metres to Meters in the mercator code.
Diffstat (limited to 'geometry')
-rw-r--r--geometry/geometry_tests/mercator_test.cpp4
-rw-r--r--geometry/mercator.cpp12
-rw-r--r--geometry/mercator.hpp18
3 files changed, 20 insertions, 14 deletions
diff --git a/geometry/geometry_tests/mercator_test.cpp b/geometry/geometry_tests/mercator_test.cpp
index 6236b25019..c856c01222 100644
--- a/geometry/geometry_tests/mercator_test.cpp
+++ b/geometry/geometry_tests/mercator_test.cpp
@@ -58,11 +58,11 @@ UNIT_TEST(Mercator_ErrorToRadius)
double const lat = points[j];
m2::PointD const mercPoint(MercatorBounds::LonToX(lon), MercatorBounds::LatToY(lat));
- m2::RectD const radius1 = MercatorBounds::MetresToXY(lon, lat, error1);
+ m2::RectD const radius1 = MercatorBounds::MetersToXY(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);
+ m2::RectD const radius10 = MercatorBounds::MetersToXY(lon, lat, error10);
TEST(radius10.IsPointInside(mercPoint), (lat, lon));
TEST(radius10.Center().EqualDxDy(mercPoint, 1.0E-8), ());
diff --git a/geometry/mercator.cpp b/geometry/mercator.cpp
index b997aace27..3ba242c644 100644
--- a/geometry/mercator.cpp
+++ b/geometry/mercator.cpp
@@ -7,34 +7,34 @@
using namespace std;
-m2::RectD MercatorBounds::MetresToXY(double lon, double lat, double lonMetresR, double latMetresR)
+m2::RectD MercatorBounds::MetersToXY(double lon, double lat, double lonMetersR, double latMetersR)
{
- double const latDegreeOffset = latMetresR * degreeInMetres;
+ double const latDegreeOffset = latMetersR * kDegreesInMeter;
double const minLat = max(-90.0, lat - latDegreeOffset);
double const maxLat = min(90.0, lat + latDegreeOffset);
double const cosL = max(cos(base::DegToRad(max(fabs(minLat), fabs(maxLat)))), 0.00001);
ASSERT_GREATER(cosL, 0.0, ());
- double const lonDegreeOffset = lonMetresR * degreeInMetres / cosL;
+ double const lonDegreeOffset = lonMetersR * kDegreesInMeter / cosL;
double const minLon = max(-180.0, lon - lonDegreeOffset);
double const maxLon = min(180.0, lon + lonDegreeOffset);
return m2::RectD(FromLatLon(minLat, minLon), FromLatLon(maxLat, maxLon));
}
-m2::PointD MercatorBounds::GetSmPoint(m2::PointD const & pt, double lonMetresR, double latMetresR)
+m2::PointD MercatorBounds::GetSmPoint(m2::PointD const & pt, double lonMetersR, double latMetersR)
{
double const lat = YToLat(pt.y);
double const lon = XToLon(pt.x);
- double const latDegreeOffset = latMetresR * degreeInMetres;
+ double const latDegreeOffset = latMetersR * kDegreesInMeter;
double const newLat = min(90.0, max(-90.0, lat + latDegreeOffset));
double const cosL = max(cos(base::DegToRad(newLat)), 0.00001);
ASSERT_GREATER(cosL, 0.0, ());
- double const lonDegreeOffset = lonMetresR * degreeInMetres / cosL;
+ double const lonDegreeOffset = lonMetersR * kDegreesInMeter / cosL;
double const newLon = min(180.0, max(-180.0, lon + lonDegreeOffset));
return FromLatLon(newLat, newLon);
diff --git a/geometry/mercator.hpp b/geometry/mercator.hpp
index d3e8270e2c..81ccdad485 100644
--- a/geometry/mercator.hpp
+++ b/geometry/mercator.hpp
@@ -15,6 +15,11 @@ struct MercatorBounds
static double constexpr kRangeX = kMaxX - kMinX;
static double constexpr kRangeY = kMaxY - kMinY;
+ // The denominator is the Earth circumference at the Equator in meters.
+ // The value is a bit off for some reason; 40075160 seems to be correct.
+ static double constexpr kDegreesInMeter = 360.0 / 40008245.0;
+ static double constexpr kMetersInDegree = 40008245.0 / 360.0;
+
static m2::RectD FullRect() { return m2::RectD(kMinX, kMinY, kMaxX, kMaxY); }
static bool ValidLon(double d) { return base::between_s(-180.0, 180.0, d); }
@@ -39,16 +44,17 @@ struct MercatorBounds
static double LonToX(double lon) { return lon; }
- static double constexpr degreeInMetres = 360.0 / 40008245;
+ static double MetersToMercator(double meters) { return meters * kDegreesInMeter; }
+ static double MercatorToMeters(double mercator) { return mercator * kMetersInDegree; }
/// @name Get rect for center point (lon, lat) and dimensions in metres.
//@{
/// @return mercator rect.
- static m2::RectD MetresToXY(double lon, double lat, double lonMetresR, double latMetresR);
+ static m2::RectD MetersToXY(double lon, double lat, double lonMetersR, double latMetersR);
- static m2::RectD MetresToXY(double lon, double lat, double metresR)
+ static m2::RectD MetersToXY(double lon, double lat, double metresR)
{
- return MetresToXY(lon, lat, metresR, metresR);
+ return MetersToXY(lon, lat, metresR, metresR);
}
//@}
@@ -58,7 +64,7 @@ struct MercatorBounds
ASSERT_GREATER_OR_EQUAL(sizeX, 0, ());
ASSERT_GREATER_OR_EQUAL(sizeY, 0, ());
- return MetresToXY(XToLon(centerX), YToLat(centerY), sizeX, sizeY);
+ return MetersToXY(XToLon(centerX), YToLat(centerY), sizeX, sizeY);
}
static m2::RectD RectByCenterXYAndSizeInMeters(m2::PointD const & center, double size)
@@ -72,7 +78,7 @@ struct MercatorBounds
ClampX(center.x + offset), ClampY(center.y + offset)};
}
- static m2::PointD GetSmPoint(m2::PointD const & pt, double lonMetresR, double latMetresR);
+ static m2::PointD GetSmPoint(m2::PointD const & pt, double lonMetersR, double latMetersR);
static m2::PointD FromLatLon(double lat, double lon)
{