summaryrefslogtreecommitdiff
path: root/src/location/maps/qgeoprojection_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/location/maps/qgeoprojection_p.h')
-rw-r--r--src/location/maps/qgeoprojection_p.h67
1 files changed, 49 insertions, 18 deletions
diff --git a/src/location/maps/qgeoprojection_p.h b/src/location/maps/qgeoprojection_p.h
index c31f806b..d8508578 100644
--- a/src/location/maps/qgeoprojection_p.h
+++ b/src/location/maps/qgeoprojection_p.h
@@ -71,6 +71,9 @@ public:
virtual double mapWidth() const = 0;
virtual double mapHeight() const = 0;
+ virtual bool isProjectable(const QDoubleVector2D &wrappedProjection) const = 0;
+ virtual QList<QDoubleVector2D> visibleRegion() const = 0;
+
// Conversion methods for QGeoCoordinate <-> screen.
// This currently assumes that the "MapProjection" space is [0, 1][0, 1] for every type of possibly supported map projection
virtual QDoubleVector2D geoToMapProjection(const QGeoCoordinate &coordinate) const = 0;
@@ -83,9 +86,10 @@ public:
virtual QDoubleVector2D itemPositionToWrappedMapProjection(const QDoubleVector2D &itemPosition) const = 0;
// Convenience methods to avoid the chain itemPositionToWrappedProjection(wrapProjection(geoToProjection()))
- // These also come with a default implementation that can, however, be overridden.
virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const = 0;
virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const = 0;
+ virtual QDoubleVector2D geoToWrappedMapProjection(const QGeoCoordinate &coordinate) const = 0;
+ virtual QGeoCoordinate wrappedMapProjectionToGeo(const QDoubleVector2D &wrappedProjection) const = 0;
};
class Q_LOCATION_PRIVATE_EXPORT QGeoProjectionWebMercator : public QGeoProjection
@@ -115,11 +119,42 @@ public:
QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const Q_DECL_OVERRIDE;
QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const Q_DECL_OVERRIDE;
+ QDoubleVector2D geoToWrappedMapProjection(const QGeoCoordinate &coordinate) const Q_DECL_OVERRIDE;
+ QGeoCoordinate wrappedMapProjectionToGeo(const QDoubleVector2D &wrappedProjection) const Q_DECL_OVERRIDE;
+
+ bool isProjectable(const QDoubleVector2D &wrappedProjection) const Q_DECL_OVERRIDE;
+ QList<QDoubleVector2D> visibleRegion() const Q_DECL_OVERRIDE;
+
+ inline QDoubleVector2D viewportToWrappedMapProjection(const QDoubleVector2D &itemPosition) const;
- bool isProjectable(const QDoubleVector2D &wrappedProjection) const;
private:
void setupCamera();
+public:
+ struct Line2D
+ {
+ Line2D();
+ Line2D(const QDoubleVector2D &linePoint, const QDoubleVector2D &lineDirection);
+
+ bool isValid() const;
+
+ QDoubleVector2D m_point;
+ QDoubleVector2D m_direction;
+ };
+
+ struct Plane
+ {
+ Plane();
+ Plane(const QDoubleVector3D &planePoint, const QDoubleVector3D &planeNormal);
+
+ QDoubleVector3D lineIntersection(const QDoubleVector3D &linePoint, const QDoubleVector3D &lineDirection) const;
+ Line2D planeXYIntersection() const;
+ bool isValid() const;
+
+ QDoubleVector3D m_point;
+ QDoubleVector3D m_normal;
+ };
+
private:
QGeoCameraData m_cameraData;
double m_mapEdgeSize;
@@ -149,23 +184,19 @@ private:
double m_halfWidth;
double m_halfHeight;
- struct Plane
- {
- Plane() {}
- Plane(const QDoubleVector3D &planePoint, const QDoubleVector3D &planeNormal)
- : m_point(planePoint), m_normal(planeNormal) { }
-
- QDoubleVector3D lineIntersection(const QDoubleVector3D &linePoint, const QDoubleVector3D &lineDirection) const
- {
- QDoubleVector3D w = linePoint - m_point;
- // s = -n.dot(w) / n.dot(u). p = p0 + su; u is lineDirection
- double s = QDoubleVector3D::dotProduct(-m_normal, w) / QDoubleVector3D::dotProduct(m_normal, lineDirection);
- return linePoint + lineDirection * s;
- }
+ // For the clipping region
+ QDoubleVector3D m_centerMercator;
+ QDoubleVector3D m_eyeMercator;
+ QDoubleVector3D m_viewMercator;
+ QDoubleVector3D m_upMercator;
+ QDoubleVector3D m_sideMercator;
+ QDoubleVector3D m_centerNearPlaneMercator;
+ double m_nearPlaneMercator;
+ Line2D m_nearPlaneMapIntersection;
- QDoubleVector3D m_point;
- QDoubleVector3D m_normal;
- } m_plane;
+ QList<QDoubleVector2D> m_visibleRegion;
+
+ Q_DISABLE_COPY(QGeoProjectionWebMercator)
};
QT_END_NAMESPACE