From 0005ca4eef8bb6bf5f8a6ef28a1c9cc324939d73 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Wed, 12 Feb 2014 11:20:21 -0800 Subject: [PATCH] fixes #57: flesh out remainder of getters & setters plus animation --- include/llmr/map/map.hpp | 17 ++++---- include/llmr/map/transform.hpp | 10 +++-- src/map/map.cpp | 58 +++++++++++++++++++++++---- src/map/transform.cpp | 71 ++++++++++++++++++++++++---------- 4 files changed, 117 insertions(+), 39 deletions(-) diff --git a/include/llmr/map/map.hpp b/include/llmr/map/map.hpp index 0bdfbd82a..84cb4d12e 100644 --- a/include/llmr/map/map.hpp +++ b/include/llmr/map/map.hpp @@ -34,22 +34,23 @@ public: /* position */ void moveBy(double dx, double dy, double duration = 0); - // void setLonLat(double lon, double lat); + void setLonLat(double lon, double lat, double duration = 0); + void getLonLat(double &lon, double &lat) const; void resetPosition(); /* scale */ void scaleBy(double ds, double cx = -1, double cy = -1, double duration = 0); void setScale(double scale, double cx = -1, double cy = -1, double duration = 0); double getScale() const; - // void setZoom(double zoom); - // void setLonLatZoom(double lon, double lat, double zoom); - // double getZoom() const; - // void getLonLatZoom(double &lon, double &lat, double &zoom) const; - // void resetZoom(); + void setZoom(double zoom, double duration = 0); + double getZoom() const; + void setLonLatZoom(double lon, double lat, double zoom, double duration = 0); + void getLonLatZoom(double &lon, double &lat, double &zoom) const; + void resetZoom(); /* rotation */ - void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey); - void setAngle(double angle, double cx = -1, double cy = -1); + void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration = 0); + void setAngle(double angle, double cx = -1, double cy = -1, double duration = 0); double getAngle() const; void resetNorth(); diff --git a/include/llmr/map/transform.hpp b/include/llmr/map/transform.hpp index 27a234419..0118659dd 100644 --- a/include/llmr/map/transform.hpp +++ b/include/llmr/map/transform.hpp @@ -24,13 +24,14 @@ public: // Relative changes void moveBy(double dx, double dy, double duration = 0); void scaleBy(double ds, double cx = -1, double cy = -1, double duration = 0); - void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey); + void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration = 0); // Absolute changes void setScale(double scale, double cx = -1, double cy = -1, double duration = 0); void setAngle(double angle, double duration = 0); - void setZoom(double zoom); - void setLonLat(double lon, double lat); + void setZoom(double zoom, double duration = 0); + void setLonLat(double lon, double lat, double duration = 0); + void setLonLatZoom(double lon, double lat, double zoom, double duration = 0); // Getters void matrixFor(mat4& matrix, const vec3& id) const; @@ -39,12 +40,13 @@ public: double getScale() const; double getAngle() const; void getLonLat(double& lon, double& lat) const; - + void getLonLatZoom(double& lon, double& lat, double& zoom) const; // Temporary void mapCornersToBox(uint32_t z, box& b) const; private: + void setScaleXY(double new_scale, double xn, double yn, double duration = 0); double pixel_x() const; double pixel_y() const; diff --git a/src/map/map.cpp b/src/map/map.cpp index 09428dc57..f86d4eb32 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -75,14 +75,40 @@ void Map::scaleBy(double ds, double cx, double cy, double duration) { settings.save(); } -void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double ey) { - transform.rotateBy(cx, cy, sx, sy, ex, ey); +void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration) { + transform.rotateBy(cx, cy, sx, sy, ex, ey, duration); update(); settings.angle = transform.getAngle(); settings.save(); } +void Map::setLonLat(double lon, double lat, double duration) { + transform.setLonLat(lon, lat, duration); + update(); + + transform.getLonLat(settings.longitude, settings.latitude); + settings.save(); +} + +void Map::getLonLat(double &lon, double &lat) const { + transform.getLonLat(lon, lat); +} + +void Map::setLonLatZoom(double lon, double lat, double zoom, double duration) { + transform.setLonLatZoom(lon, lat, zoom, duration); + style.cascade(transform.getZoom()); + update(); + + transform.getLonLat(settings.longitude, settings.latitude); + settings.scale = transform.getScale(); + settings.save(); +} + +void Map::getLonLatZoom(double &lon, double &lat, double &zoom) const { + transform.getLonLatZoom(lon, lat, zoom); +} + void Map::setScale(double scale, double cx, double cy, double duration) { transform.setScale(scale, cx, cy, duration); style.cascade(transform.getZoom()); @@ -93,19 +119,33 @@ void Map::setScale(double scale, double cx, double cy, double duration) { settings.save(); } -void Map::setAngle(double angle, double x, double y) { +void Map::setZoom(double zoom, double duration) { + transform.setZoom(zoom, duration); + style.cascade(transform.getZoom()); + update(); + + transform.getLonLat(settings.longitude, settings.latitude); + settings.scale = transform.getScale(); + settings.save(); +} + +double Map::getZoom() const { + return transform.getZoom(); +} + +void Map::setAngle(double angle, double x, double y, double duration) { double dx = 0, dy = 0; if (x >= 0 && y >= 0) { dx = (transform.width / 2) - x; dy = (transform.height / 2) - y; - transform.moveBy(dx, dy); + transform.moveBy(dx, dy, duration); } - transform.setAngle(angle); + transform.setAngle(angle, duration); if (x >= 0 && y >= 0) { - transform.moveBy(-dx, -dy); + transform.moveBy(-dx, -dy, duration); } update(); @@ -124,7 +164,7 @@ double Map::getAngle() const { } void Map::resetNorth() { - transform.setAngle(0, 0.5); // 500 ms + transform.setAngle(0, 0.5); update(); settings.angle = transform.getAngle(); @@ -144,6 +184,10 @@ void Map::resetPosition() { settings.save(); } +void Map::resetZoom() { + setZoom(0); +} + void Map::toggleDebug() { settings.debug = !settings.debug; update(); diff --git a/src/map/transform.cpp b/src/map/transform.cpp index 510d51bc9..3fab6d299 100644 --- a/src/map/transform.cpp +++ b/src/map/transform.cpp @@ -59,7 +59,7 @@ void Transform::scaleBy(double ds, double cx, double cy, double duration) { } -void Transform::rotateBy(double anchor_x, double anchor_y, double start_x, double start_y, double end_x, double end_y) { +void Transform::rotateBy(double anchor_x, double anchor_y, double start_x, double start_y, double end_x, double end_y, double duration) { double center_x = width / 2, center_y = height / 2; const double begin_center_x = start_x - center_x; @@ -83,7 +83,7 @@ void Transform::rotateBy(double anchor_x, double anchor_y, double start_x, doubl const double ang = angle + util::angle_between(first_x, first_y, second_x, second_y); - setAngle(ang); + setAngle(ang, duration); } void Transform::setAngle(double new_angle, double duration) { @@ -97,6 +97,23 @@ void Transform::setAngle(double new_angle, double duration) { } } +void Transform::setScaleXY(double new_scale, double xn, double yn, double duration) { + if (duration == 0) { + scale = new_scale; + x = xn; + y = yn; + } else { + animations.emplace_front(scale, new_scale, scale, duration); + animations.emplace_front(x, xn, x, duration); + animations.emplace_front(y, yn, y, duration); + } + + const double s = scale * size; + zc = s / 2; + Bc = s / 360; + Cc = s / (2 * M_PI); +} + void Transform::setScale(double new_scale, double cx, double cy, double duration) { if (new_scale < min_scale) { new_scale = min_scale; @@ -104,6 +121,11 @@ void Transform::setScale(double new_scale, double cx, double cy, double duration new_scale = max_scale; } + if (cx < 0 || cy < 0) { + cx = width / 2; + cy = height / 2; + } + const double factor = new_scale / scale; const double dx = (cx - width / 2) * (1.0 - factor); const double dy = (cy - height / 2) * (1.0 - factor); @@ -111,30 +133,34 @@ void Transform::setScale(double new_scale, double cx, double cy, double duration double xn = x * factor + dx; double yn = y * factor + dy; - if (duration == 0) { - x = xn; - y = yn; - scale = new_scale; - } else { - animations.emplace_front(x, xn, x, duration); - animations.emplace_front(y, yn, y, duration); - animations.emplace_front(scale, new_scale, scale, duration); - } + setScaleXY(new_scale, xn, yn, duration); +} - const double s = scale * size; +void Transform::setZoom(double zoom, double duration) { + setScale(pow(2.0, zoom), -1, -1, duration); +} + +void Transform::setLonLat(double lon, double lat, double duration) { + const double f = fmin(fmax(sin(D2R * lat), -0.9999), 0.9999); + double xn = -round(lon * Bc); + double yn = round(0.5 * Cc * log((1 + f) / (1 - f))); + + setScaleXY(scale, xn, yn, duration); +} + +void Transform::setLonLatZoom(double lon, double lat, double zoom, double duration) { + double new_scale = pow(2.0, zoom); + + const double s = new_scale * size; zc = s / 2; Bc = s / 360; Cc = s / (2 * M_PI); -} -void Transform::setZoom(double zoom) { - setScale(pow(2.0, zoom)); -} - -void Transform::setLonLat(double lon, double lat) { const double f = fmin(fmax(sin(D2R * lat), -0.9999), 0.9999); - x = -round(lon * Bc); - y = round(0.5 * Cc * log((1 + f) / (1 - f))); + double xn = -round(lon * Bc); + double yn = round(0.5 * Cc * log((1 + f) / (1 - f))); + + setScaleXY(new_scale, xn, yn, duration); } void Transform::getLonLat(double &lon, double &lat) const { @@ -142,6 +168,11 @@ void Transform::getLonLat(double &lon, double &lat) const { lat = R2D * (2 * atan(exp(y / Cc)) - 0.5 * M_PI); } +void Transform::getLonLatZoom(double& lon, double& lat, double& zoom) const { + getLonLat(lon, lat); + zoom = getZoom(); +} + double Transform::pixel_x() const { const double center = (width - scale * size) / 2; return center + x;