2018-04-13 21:14:12 +02:00
|
|
|
#include "wgs84.h"
|
2017-06-29 22:29:27 +02:00
|
|
|
#include "rectc.h"
|
|
|
|
|
2018-04-13 21:14:12 +02:00
|
|
|
#define MIN_LAT deg2rad(-90.0)
|
|
|
|
#define MAX_LAT deg2rad(90.0)
|
|
|
|
#define MIN_LON deg2rad(-180.0)
|
|
|
|
#define MAX_LON deg2rad(180.0)
|
|
|
|
|
|
|
|
RectC::RectC(const Coordinates ¢er, double radius)
|
|
|
|
{
|
|
|
|
double radDist = radius / WGS84_RADIUS;
|
|
|
|
double radLon = deg2rad(center.lon());
|
|
|
|
double radlat = deg2rad(center.lat());
|
|
|
|
|
|
|
|
double minLat = radlat - radDist;
|
|
|
|
double maxLat = radlat + radDist;
|
|
|
|
|
|
|
|
double minLon, maxLon;
|
|
|
|
if (minLat > MIN_LAT && maxLat < MAX_LAT) {
|
|
|
|
double deltaLon = asin(sin(radDist) / cos(radlat));
|
|
|
|
minLon = radLon - deltaLon;
|
|
|
|
if (minLon < MIN_LON)
|
2018-05-15 21:51:56 +02:00
|
|
|
minLon += M_2_PI;
|
2018-04-13 21:14:12 +02:00
|
|
|
maxLon = radLon + deltaLon;
|
|
|
|
if (maxLon > MAX_LON)
|
2018-05-15 21:51:56 +02:00
|
|
|
maxLon -= M_2_PI;
|
2018-04-13 21:14:12 +02:00
|
|
|
} else {
|
|
|
|
// a pole is within the distance
|
|
|
|
minLat = qMax(minLat, MIN_LAT);
|
|
|
|
maxLat = qMin(maxLat, MAX_LAT);
|
|
|
|
minLon = MIN_LON;
|
|
|
|
maxLon = MAX_LON;
|
|
|
|
}
|
|
|
|
|
|
|
|
_tl = Coordinates(rad2deg(minLon), rad2deg(maxLat));
|
|
|
|
_br = Coordinates(rad2deg(maxLon), rad2deg(minLat));
|
|
|
|
}
|
|
|
|
|
2017-06-29 22:29:27 +02:00
|
|
|
RectC RectC::operator|(const RectC &r) const
|
|
|
|
{
|
|
|
|
if (isNull())
|
|
|
|
return r;
|
|
|
|
if (r.isNull())
|
|
|
|
return *this;
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double l1 = _tl.lon();
|
|
|
|
double r1 = _tl.lon();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (_br.lon() < _tl.lon())
|
2017-06-29 22:29:27 +02:00
|
|
|
l1 = _br.lon();
|
|
|
|
else
|
|
|
|
r1 = _br.lon();
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double l2 = r._tl.lon();
|
|
|
|
double r2 = r._tl.lon();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (r._br.lon() < r._tl.lon())
|
2017-06-29 22:29:27 +02:00
|
|
|
l2 = r._br.lon();
|
|
|
|
else
|
|
|
|
r2 = r._br.lon();
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double t1 = _tl.lat();
|
|
|
|
double b1 = _tl.lat();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (_br.lat() > _tl.lat())
|
2017-06-29 22:29:27 +02:00
|
|
|
t1 = _br.lat();
|
|
|
|
else
|
|
|
|
b1 = _br.lat();
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double t2 = r._tl.lat();
|
|
|
|
double b2 = r._tl.lat();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (r._br.lat() > r._tl.lat())
|
2017-06-29 22:29:27 +02:00
|
|
|
t2 = r._br.lat();
|
|
|
|
else
|
|
|
|
b2 = r._br.lat();
|
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
return RectC(Coordinates(qMin(l1, l2), qMax(t1, t2)),
|
|
|
|
Coordinates(qMax(r1, r2), qMin(b1, b2)));
|
2017-06-29 22:29:27 +02:00
|
|
|
}
|
|
|
|
|
2018-04-02 23:27:42 +02:00
|
|
|
RectC RectC::operator&(const RectC &r) const
|
|
|
|
{
|
|
|
|
if (isNull() || r.isNull())
|
|
|
|
return RectC();
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double l1 = _tl.lon();
|
|
|
|
double r1 = _tl.lon();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (_br.lon() < _tl.lon())
|
2018-04-02 23:27:42 +02:00
|
|
|
l1 = _br.lon();
|
|
|
|
else
|
|
|
|
r1 = _br.lon();
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double l2 = r._tl.lon();
|
|
|
|
double r2 = r._tl.lon();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (r._br.lon() < r._tl.lon())
|
2018-04-02 23:27:42 +02:00
|
|
|
l2 = r._br.lon();
|
|
|
|
else
|
|
|
|
r2 = r._br.lon();
|
|
|
|
|
|
|
|
if (l1 > r2 || l2 > r1)
|
|
|
|
return RectC();
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double t1 = _tl.lat();
|
|
|
|
double b1 = _tl.lat();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (_br.lat() > _tl.lat())
|
2018-04-02 23:27:42 +02:00
|
|
|
t1 = _br.lat();
|
|
|
|
else
|
|
|
|
b1 = _br.lat();
|
|
|
|
|
2018-04-15 10:42:06 +02:00
|
|
|
double t2 = r._tl.lat();
|
|
|
|
double b2 = r._tl.lat();
|
2018-04-16 20:26:10 +02:00
|
|
|
if (r._br.lat() > r._tl.lat())
|
2018-04-02 23:27:42 +02:00
|
|
|
t2 = r._br.lat();
|
|
|
|
else
|
|
|
|
b2 = r._br.lat();
|
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
if (b1 > t2 || b2 > t1)
|
2018-04-02 23:27:42 +02:00
|
|
|
return RectC();
|
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
return RectC(Coordinates(qMax(l1, l2), qMin(t1, t2)),
|
|
|
|
Coordinates(qMin(r1, r2), qMax(b1, b2)));
|
2018-04-02 23:27:42 +02:00
|
|
|
}
|
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
RectC RectC::united(const Coordinates &c) const
|
2018-04-03 00:08:01 +02:00
|
|
|
{
|
2018-04-16 20:26:10 +02:00
|
|
|
if (c.isNull())
|
|
|
|
return *this;
|
|
|
|
if (isNull())
|
|
|
|
return RectC(c, c);
|
2018-04-03 00:08:01 +02:00
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
double l = _tl.lon();
|
|
|
|
double r = _tl.lon();
|
|
|
|
if (_br.lon() < _tl.lon())
|
|
|
|
l = _br.lon();
|
|
|
|
else
|
|
|
|
r = _br.lon();
|
2018-04-03 00:08:01 +02:00
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
double t = _tl.lat();
|
|
|
|
double b = _tl.lat();
|
|
|
|
if (_br.lat() > _tl.lat())
|
|
|
|
t = _br.lat();
|
|
|
|
else
|
|
|
|
b = _br.lat();
|
|
|
|
|
|
|
|
if (c.lon() < l)
|
|
|
|
l = c.lon();
|
|
|
|
if (c.lon() > r)
|
|
|
|
r = c.lon();
|
|
|
|
if (c.lat() < b)
|
|
|
|
b = c.lat();
|
|
|
|
if (c.lat() > t)
|
|
|
|
t = c.lat();
|
|
|
|
|
|
|
|
return RectC(Coordinates(l, t), Coordinates(r, b));
|
2017-06-29 22:29:27 +02:00
|
|
|
}
|
|
|
|
|
2018-02-13 23:03:18 +01:00
|
|
|
#ifndef QT_NO_DEBUG
|
2017-06-29 22:29:27 +02:00
|
|
|
QDebug operator<<(QDebug dbg, const RectC &rect)
|
|
|
|
{
|
2018-04-13 21:14:12 +02:00
|
|
|
dbg.nospace() << "RectC(" << rect.topLeft() << ", " << rect.bottomRight()
|
|
|
|
<< ")";
|
2017-08-15 15:13:34 +02:00
|
|
|
return dbg.space();
|
2017-06-29 22:29:27 +02:00
|
|
|
}
|
2018-02-13 23:03:18 +01:00
|
|
|
#endif // QT_NO_DEBUG
|