diff options
Diffstat (limited to 'src/location/maps/qgeoprojection_p.h')
-rw-r--r-- | src/location/maps/qgeoprojection_p.h | 67 |
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 |