fixes #57: flesh out remainder of getters & setters plus animation

This commit is contained in:
Justin R. Miller
2014-02-12 11:20:21 -08:00
parent b78df1903a
commit 0005ca4eef
4 changed files with 117 additions and 39 deletions

View File

@@ -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();

View File

@@ -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<int32_t>& 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;

View File

@@ -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();

View File

@@ -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;