Merge remote-tracking branch 'origin/animated-scale'

This commit is contained in:
Konstantin Käfer
2014-02-06 15:18:17 +01:00
4 changed files with 23 additions and 20 deletions

View File

@@ -37,8 +37,8 @@ public:
void resetPosition();
/* scale */
void scaleBy(double ds, double cx, double cy);
void setScale(double 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);

View File

@@ -22,11 +22,11 @@ public:
// Relative changes
void moveBy(double dx, double dy);
void scaleBy(double ds, double cx, double cy);
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);
// Absolute changes
void setScale(double scale);
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);

View File

@@ -65,8 +65,8 @@ void Map::moveBy(double dx, double dy) {
settings.save();
}
void Map::scaleBy(double ds, double cx, double cy) {
transform.scaleBy(ds, cx, cy);
void Map::scaleBy(double ds, double cx, double cy, double duration) {
transform.scaleBy(ds, cx, cy, duration);
style.cascade(transform.getZoom());
update();
@@ -83,8 +83,8 @@ void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double
settings.save();
}
void Map::setScale(double scale) {
transform.setScale(scale);
void Map::setScale(double scale, double cx, double cy, double duration) {
transform.setScale(scale, cx, cy, duration);
style.cascade(transform.getZoom());
update();

View File

@@ -33,7 +33,7 @@ void Transform::moveBy(double dx, double dy) {
y += cos(angle) * dy + sin(-angle) * dx;
}
void Transform::scaleBy(double ds, double cx, double cy) {
void Transform::scaleBy(double ds, double cx, double cy, double duration) {
// clamp scale to min/max values
double new_scale = scale * ds;
if (new_scale < min_scale) {
@@ -44,13 +44,7 @@ void Transform::scaleBy(double ds, double cx, double cy) {
new_scale = max_scale;
}
setScale(new_scale);
// Correct for non-center scaling location.
const double dx = (cx - width / 2) * (1.0 - ds);
const double dy = (cy - height / 2) * (1.0 - ds);
x += cos(angle) * dx + sin(angle) * dy;
y += cos(angle) * dy + sin(-angle) * dx;
setScale(new_scale, cx, cy, duration);
}
@@ -92,7 +86,7 @@ void Transform::setAngle(double new_angle, double duration) {
}
}
void Transform::setScale(double new_scale) {
void Transform::setScale(double new_scale, double cx, double cy, double duration) {
if (new_scale < min_scale) {
new_scale = min_scale;
} else if (new_scale > max_scale) {
@@ -100,9 +94,18 @@ void Transform::setScale(double new_scale) {
}
const double factor = new_scale / scale;
x *= factor;
y *= factor;
scale = new_scale;
const double dx = (cx - width / 2) * (1.0 - factor);
const double dy = (cy - height / 2) * (1.0 - factor);
if (duration == 0) {
x = x * factor + dx;
y = y * factor + dy;
scale = new_scale;
} else {
animations.emplace_front(x, x * factor + dx, x, duration);
animations.emplace_front(y, y * factor + dy, y, duration);
animations.emplace_front(scale, new_scale, scale, duration);
}
const double s = scale * size;
zc = s / 2;