1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-28 05:34:47 +01:00

Compare commits

..

No commits in common. "d8f7089450bbf6e56b097be33dbd19b9ae391208" and "54e185ed4a321f681066681bdcddaf34272d6cac" have entirely different histories.

6 changed files with 33 additions and 40 deletions

View File

@ -28,14 +28,14 @@
#define SRTM_SIZE(samples) \ #define SRTM_SIZE(samples) \
((samples) * (samples) * 2) ((samples) * (samples) * 2)
static double interpolate(double dx, double dy, double p0, double p1, double p2, static qreal interpolate(qreal dx, qreal dy, qreal p0, qreal p1, qreal p2,
double p3) qreal p3)
{ {
return p0 * (1.0 - dx) * (1.0 - dy) + p1 * dx * (1.0 - dy) return p0 * (1 - dx) * (1 - dy) + p1 * dx * (1 - dy) + p2 * dy * (1 - dx)
+ p2 * dy * (1.0 - dx) + p3 * dx * dy; + p3 * dx * dy;
} }
static double value(int col, int row, int samples, const QByteArray *data) static qreal value(int col, int row, int samples, const QByteArray *data)
{ {
int pos = ((samples - 1 - row) * samples + col) * 2; int pos = ((samples - 1 - row) * samples + col) * 2;
qint16 val = qFromBigEndian(*((const qint16*)(data->constData() + pos))); qint16 val = qFromBigEndian(*((const qint16*)(data->constData() + pos)));
@ -43,7 +43,7 @@ static double value(int col, int row, int samples, const QByteArray *data)
return (val == -32768) ? NAN : val; return (val == -32768) ? NAN : val;
} }
static double height(const Coordinates &c, const QByteArray *data) static qreal height(const Coordinates &c, const QByteArray *data)
{ {
int samples; int samples;
@ -56,17 +56,17 @@ static double height(const Coordinates &c, const QByteArray *data)
else else
return NAN; return NAN;
double lat = (c.lat() - floor(c.lat())) * (samples - 1); int row = (int)((c.lat() - qFloor(c.lat())) * (samples - 1));
double lon = (c.lon() - floor(c.lon())) * (samples - 1); int col = (int)((c.lon() - qFloor(c.lon())) * (samples - 1));
int row = (int)lat; qreal dx = ((c.lon() - qFloor(c.lon())) * (samples - 1)) - col;
int col = (int)lon; qreal dy = ((c.lat() - qFloor(c.lat())) * (samples - 1)) - row;
double p0 = value(col, row, samples, data); qreal p0 = value(col, row, samples, data);
double p1 = value(col + 1, row, samples, data); qreal p1 = value(col + 1, row, samples, data);
double p2 = value(col, row + 1, samples, data); qreal p2 = value(col, row + 1, samples, data);
double p3 = value(col + 1, row + 1, samples, data); qreal p3 = value(col + 1, row + 1, samples, data);
return interpolate(lon - col, lat - row, p0, p1, p2, p3); return interpolate(dx, dy, p0, p1, p2, p3);
} }
QMutex DEM::_lock; QMutex DEM::_lock;
@ -111,7 +111,7 @@ void DEM::clearCache()
_data.clear(); _data.clear();
} }
double DEM::elevation(const Coordinates &c) qreal DEM::elevation(const Coordinates &c)
{ {
if (_dir.isEmpty()) if (_dir.isEmpty())
return NAN; return NAN;
@ -127,7 +127,7 @@ double DEM::elevation(const Coordinates &c)
if (QFileInfo::exists(zn)) { if (QFileInfo::exists(zn)) {
QZipReader zip(zn, QIODevice::ReadOnly); QZipReader zip(zn, QIODevice::ReadOnly);
ba = new QByteArray(zip.fileData(bn)); ba = new QByteArray(zip.fileData(bn));
double ele = height(c, ba); qreal ele = height(c, ba);
_data.insert(tile, ba, ba->size()); _data.insert(tile, ba, ba->size());
return ele; return ele;
} else { } else {
@ -139,7 +139,7 @@ double DEM::elevation(const Coordinates &c)
return NAN; return NAN;
} else { } else {
ba = new QByteArray(file.readAll()); ba = new QByteArray(file.readAll());
double ele = height(c, ba); qreal ele = height(c, ba);
_data.insert(tile, ba, ba->size()); _data.insert(tile, ba, ba->size());
return ele; return ele;
} }

View File

@ -37,7 +37,7 @@ public:
static void setDir(const QString &path); static void setDir(const QString &path);
static void clearCache(); static void clearCache();
static double elevation(const Coordinates &c); static qreal elevation(const Coordinates &c);
static void lock() {_lock.lock();} static void lock() {_lock.lock();}
static void unlock() {_lock.unlock();} static void unlock() {_lock.unlock();}

View File

@ -454,16 +454,11 @@ Matrix RasterTile::elevation() const
int top = _rect.top() - 1; int top = _rect.top() - 1;
int bottom = _rect.bottom() + 1; int bottom = _rect.bottom() + 1;
QVector<Coordinates> ll; DEM::lock();
ll.reserve(m.w() * m.h());
for (int y = top; y <= bottom; y++) { for (int y = top; y <= bottom; y++) {
for (int x = left; x <= right; x++) for (int x = left; x <= right; x++)
ll.append(xy2ll(QPointF(x, y))); m.m(y - top, x - left) = DEM::elevation(xy2ll(QPointF(x, y)));
} }
DEM::lock();
for (int i = 0; i < ll.size(); i++)
m.m(i) = DEM::elevation(ll.at(i));
DEM::unlock(); DEM::unlock();
return m; return m;

View File

@ -81,14 +81,18 @@ QImage HillShading::render(const Matrix &m, quint8 alpha, double azimuth,
double L = (c.a1 - c.a2 * d.dzdx - c.a3 * d.dzdy) double L = (c.a1 - c.a2 * d.dzdx - c.a3 * d.dzdy)
/ sqrt(1.0 + d.dzdx * d.dzdx + d.dzdy * d.dzdy); / sqrt(1.0 + d.dzdx * d.dzdx + d.dzdy * d.dzdy);
quint32 pixel; quint8 a, val;
if (std::isnan(L)) if (std::isnan(L)) {
pixel = 0; a = 0;
else { val = 0;
quint8 val = (L < 0) ? 0 : L * alpha; } else {
pixel = alpha<<24 | val<<16 | val<<8 | val; if (L < 0)
L = 0;
val = L * alpha;
a = alpha;
} }
quint32 pixel = a<<24 | val<<16 | val<<8 | val;
*(quint32*)(bits + (y - 1) * bpl + (x - 1) * 4) = pixel; *(quint32*)(bits + (y - 1) * bpl + (x - 1) * 4) = pixel;
} }
} }

View File

@ -480,16 +480,11 @@ Matrix RasterTile::elevation() const
int top = _rect.top() - 1; int top = _rect.top() - 1;
int bottom = _rect.bottom() + 1; int bottom = _rect.bottom() + 1;
QVector<Coordinates> ll; DEM::lock();
ll.reserve(m.w() * m.h());
for (int y = top; y <= bottom; y++) { for (int y = top; y <= bottom; y++) {
for (int x = left; x <= right; x++) for (int x = left; x <= right; x++)
ll.append(xy2ll(QPointF(x, y))); m.m(y - top, x - left) = DEM::elevation(xy2ll(QPointF(x, y)));
} }
DEM::lock();
for (int i = 0; i < ll.size(); i++)
m.m(i) = DEM::elevation(ll.at(i));
DEM::unlock(); DEM::unlock();
return m; return m;

View File

@ -13,7 +13,6 @@ public:
int h() const {return _h;} int h() const {return _h;}
int w() const {return _w;} int w() const {return _w;}
double &m(int n) {return _m[n];}
double &m(int i, int j) {return _m[_w * i + j];} double &m(int i, int j) {return _m[_w * i + j];}
double const &m(int i, int j) const {return _m.at(_w * i + j);} double const &m(int i, int j) const {return _m.at(_w * i + j);}