USA.
*/
+#include <cmath>
+
#include <QDebug>
+#include <QLineF>
+#include <QPointF>
+#include <QVariant>
#include "geocoordinate.h"
-#include "map/mapcommon.h"
+#include "map/osm.h"
#include "scenecoordinate.h"
qDebug() << __PRETTY_FUNCTION__;
}
-SceneCoordinate::SceneCoordinate(GeoCoordinate &coordinate)
+SceneCoordinate::SceneCoordinate(const GeoCoordinate &coordinate)
{
qDebug() << __PRETTY_FUNCTION__;
convertFrom(coordinate);
}
+qreal SceneCoordinate::azimuthTo(const SceneCoordinate &to) const
+{
+ QLineF line = QLineF(this->toPointF(), to.toPointF());
+ return -line.angle() + 90.0;
+}
+
void SceneCoordinate::convertFrom(const GeoCoordinate &coordinate)
{
qDebug() << __PRETTY_FUNCTION__;
- Q_ASSERT(coordinate.longitude() > MAX_LONGITUDE);
- Q_ASSERT(coordinate.longitude() < MIN_LONGITUDE);
- Q_ASSERT(coordinate.latitude() > MAX_LATITUDE);
- Q_ASSERT(coordinate.latitude() < MIN_LATITUDE);
-
// calculate x & y positions in the map (0..1)
double worldX = static_cast<double>((coordinate.longitude() + 180.0) / 360.0);
double worldY = static_cast<double>((1.0 - log(tan(coordinate.latitude() * M_PI / 180.0) + 1.0
/ cos(coordinate.latitude() * M_PI / 180.0)) / M_PI) / 2.0);
- setX(worldX * MAX_TILES_PER_SIDE * TILE_SIZE_X);
- setY(worldY * MAX_TILES_PER_SIDE * TILE_SIZE_Y);
+ m_x = worldX * OSM_TILES_PER_SIDE * OSM_TILE_SIZE_X;
+ m_y = worldY * OSM_TILES_PER_SIDE * OSM_TILE_SIZE_Y;
- Q_ASSERT((x() >= MAP_MIN_PIXEL_X) && (x() <= MAP_MAX_PIXEL_X));
- Q_ASSERT((y() >= MAP_MIN_PIXEL_Y) && (y() <= MAP_MAX_PIXEL_Y));
+ normalize(m_x, OSM_MAP_MIN_PIXEL_X, OSM_MAP_MAX_PIXEL_X);
}
bool SceneCoordinate::isNull() const
return false;
}
-double SceneCoordinate::x() const
+void SceneCoordinate::normalize(double &value, int min, int max)
{
qDebug() << __PRETTY_FUNCTION__;
+ Q_ASSERT_X(max >= min, "parameters", "max can't be smaller than min");
- return m_x;
-}
-
-double SceneCoordinate::y() const
-{
- qDebug() << __PRETTY_FUNCTION__;
+ while (int(value) < min)
+ value += max - min + 1;
- return m_y;
+ while (int(value) > max)
+ value -= max - min + 1;
}
void SceneCoordinate::setX(double x)
m_y = y;
}
+QPointF SceneCoordinate::toPointF() const
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ return QPointF(m_x, m_y);
+}
+
+double SceneCoordinate::x() const
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ return m_x;
+}
+
+double SceneCoordinate::y() const
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ return m_y;
+}
+
+SceneCoordinate::operator QVariant() const
+{
+ return QVariant::fromValue(*this);
+}
+
QDebug operator<<(QDebug dbg, const SceneCoordinate &coordinate)
{
dbg.nospace() << "(" << coordinate.x() << ", " << coordinate.y() << ")";
return dbg.space();
}
+
+SceneCoordinate & SceneCoordinate::operator*=(double factor)
+{
+ m_x *= factor;
+ m_y *= factor;
+ return *this;
+}
+
+SceneCoordinate & SceneCoordinate::operator+=(const SceneCoordinate &coordinate)
+{
+ m_x += coordinate.x();
+ m_y += coordinate.y();
+ return *this;
+}
+
+SceneCoordinate & SceneCoordinate::operator-=(const SceneCoordinate &coordinate)
+{
+ m_x -= coordinate.x();
+ m_y -= coordinate.y();
+ return *this;
+}
+
+const SceneCoordinate operator* (double factor, const SceneCoordinate &coordinate)
+{
+ return SceneCoordinate(coordinate) *= factor;
+}
+
+const SceneCoordinate SceneCoordinate::operator+(const SceneCoordinate &other) const
+{
+ return SceneCoordinate(*this) += other;
+}
+
+const SceneCoordinate SceneCoordinate::operator-(const SceneCoordinate &other) const
+{
+ return SceneCoordinate(*this) -= other;
+}