Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
refs #30: animated scaleBy
Browse files Browse the repository at this point in the history
 * add duration argument to scaleBy & setScale
 * add scale center arguments to setScale
 * add animation to Transform::setScale
  • Loading branch information
incanus committed Feb 5, 2014
1 parent 74f3e57 commit 3ae58c5
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 20 deletions.
4 changes: 2 additions & 2 deletions include/llmr/map/map.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ class Map {
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);
Expand Down
4 changes: 2 additions & 2 deletions include/llmr/map/transform.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ class Transform {

// 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);
Expand Down
8 changes: 4 additions & 4 deletions src/map/map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

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

Expand Down
27 changes: 15 additions & 12 deletions src/map/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
}


Expand Down Expand Up @@ -92,17 +86,26 @@ 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) {
new_scale = max_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;
Expand Down

0 comments on commit 3ae58c5

Please sign in to comment.