diff options
Diffstat (limited to 'src/map/transform.cpp')
-rw-r--r-- | src/map/transform.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/map/transform.cpp b/src/map/transform.cpp index d7c189003b..3c028be149 100644 --- a/src/map/transform.cpp +++ b/src/map/transform.cpp @@ -36,21 +36,22 @@ void transform::moveBy(double dx, double dy) { void transform::scaleBy(double ds, double cx, double cy) { // clamp scale to min/max values - const double new_scale = scale * ds; + double new_scale = scale * ds; if (new_scale < min_scale) { ds = min_scale / scale; + new_scale = min_scale; } else if (new_scale > max_scale) { ds = max_scale / scale; + 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); - const double fx = cos(angle) * dx + sin(angle) * dy; - const double fy = cos(angle) * dy + sin(-angle) * dx; - - scale *= ds; - x = (x * ds) + fx; - y = (y * ds) + fy; + x += cos(angle) * dx + sin(angle) * dy; + y += cos(angle) * dy + sin(-angle) * dx; } @@ -154,6 +155,13 @@ int32_t transform::getZoom() const { return floor(log(scale) / M_LN2); } +double transform::getScale() const { + return scale; +} + +double transform::getAngle() const { + return angle; +} void transform::mapCornersToBox(uint32_t z, box& b) const { const double ref_scale = pow(2, z); |