1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-24 11:45:53 +01:00

Prevent zoom change due to float computations errors

This commit is contained in:
Martin Tůma 2024-02-22 21:23:37 +01:00
parent f1fd4f8bc9
commit 108e68c7c9
4 changed files with 13 additions and 4 deletions

View File

@ -9,6 +9,7 @@
using namespace ENC; using namespace ENC;
#define EPSILON 1e-6
#define TILE_SIZE 512 #define TILE_SIZE 512
Range ENCAtlas::zooms(IntendedUsage usage) Range ENCAtlas::zooms(IntendedUsage usage)
@ -204,7 +205,8 @@ int ENCAtlas::zoomFit(const QSize &size, const RectC &rect)
Transform t(transform(i)); Transform t(transform(i));
QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight())); QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight()));
if (size.width() < r.width() || size.height() < r.height()) { if (size.width() + EPSILON < r.width()
|| size.height() + EPSILON < r.height()) {
updateTransform(); updateTransform();
return _zoom; return _zoom;
} }

View File

@ -12,6 +12,7 @@
using namespace ENC; using namespace ENC;
#define EPSILON 1e-6
#define TILE_SIZE 512 #define TILE_SIZE 512
static Range zooms(const RectC &bounds) static Range zooms(const RectC &bounds)
@ -204,7 +205,8 @@ int ENCMap::zoomFit(const QSize &size, const RectC &rect)
for (int i = _zooms.min() + 1; i <= _zooms.max(); i++) { for (int i = _zooms.min() + 1; i <= _zooms.max(); i++) {
Transform t(transform(i)); Transform t(transform(i));
QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight())); QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight()));
if (size.width() < r.width() || size.height() < r.height()) if (size.width() + EPSILON < r.width()
|| size.height() + EPSILON < r.height())
break; break;
_zoom = i; _zoom = i;
} }

View File

@ -15,6 +15,7 @@
using namespace IMG; using namespace IMG;
#define EPSILON 1e-6
#define TILE_SIZE 384 #define TILE_SIZE 384
static RectC limitBounds(const RectC &bounds, const Projection &proj) static RectC limitBounds(const RectC &bounds, const Projection &proj)
@ -112,7 +113,8 @@ int IMGMap::zoomFit(const QSize &size, const RectC &rect)
for (int i = zooms.min() + 1; i <= zooms.max(); i++) { for (int i = zooms.min() + 1; i <= zooms.max(); i++) {
Transform t(transform(i)); Transform t(transform(i));
QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight())); QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight()));
if (size.width() < r.width() || size.height() < r.height()) if (size.width() + EPSILON < r.width()
|| size.height() + EPSILON < r.height())
break; break;
_zoom = i; _zoom = i;
} }

View File

@ -9,6 +9,8 @@
using namespace Mapsforge; using namespace Mapsforge;
#define EPSILON 1e-6
MapsforgeMap::MapsforgeMap(const QString &fileName, QObject *parent) MapsforgeMap::MapsforgeMap(const QString &fileName, QObject *parent)
: Map(fileName, parent), _data(fileName), _zoom(0), : Map(fileName, parent), _data(fileName), _zoom(0),
_projection(PCS::pcs(3857)), _tileRatio(1.0) _projection(PCS::pcs(3857)), _tileRatio(1.0)
@ -51,7 +53,8 @@ int MapsforgeMap::zoomFit(const QSize &size, const RectC &rect)
for (int i = _data.zooms().min() + 1; i <= _data.zooms().max(); i++) { for (int i = _data.zooms().min() + 1; i <= _data.zooms().max(); i++) {
Transform t(transform(i)); Transform t(transform(i));
QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight())); QRectF r(t.proj2img(pr.topLeft()), t.proj2img(pr.bottomRight()));
if (size.width() < r.width() || size.height() < r.height()) if (size.width() + EPSILON < r.width()
|| size.height() + EPSILON < r.height())
break; break;
_zoom = i; _zoom = i;
} }