27inline static void computeBBox(
const QList<QGeoCoordinate> &m_path, QList<
double> &m_deltaXs,
28 double &m_minX,
double &m_maxX,
double &m_minLati,
double &m_maxLati,
29 QGeoRectangle &m_bbox)
31 if (m_path.isEmpty()) {
37 m_bbox = QGeoRectangle();
41 m_minLati = m_maxLati = m_path.at(0).latitude();
44 m_deltaXs.resize(m_path.size());
45 m_deltaXs[0] = m_minX = m_maxX = 0.0;
47 for (qsizetype i = 1; i < m_path.size(); i++) {
48 const QGeoCoordinate &geoFrom = m_path.at(i-1);
49 const QGeoCoordinate &geoTo = m_path.at(i);
50 double longiFrom = geoFrom.longitude();
51 double longiTo = geoTo.longitude();
52 double deltaLongi = longiTo - longiFrom;
53 if (qAbs(deltaLongi) > 180.0) {
58 deltaLongi = longiTo - longiFrom;
60 m_deltaXs[i] = m_deltaXs[i-1] + deltaLongi;
61 if (m_deltaXs[i] < m_minX) {
62 m_minX = m_deltaXs[i];
65 if (m_deltaXs[i] > m_maxX) {
66 m_maxX = m_deltaXs[i];
69 if (geoTo.latitude() > m_maxLati)
70 m_maxLati = geoTo.latitude();
71 if (geoTo.latitude() < m_minLati)
72 m_minLati = geoTo.latitude();
75 m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, m_path.at(minId).longitude()),
76 QGeoCoordinate(m_minLati, m_path.at(maxId).longitude()));
79inline static void updateBBox(
const QList<QGeoCoordinate> &m_path, QList<
double> &m_deltaXs,
80 double &m_minX,
double &m_maxX,
double &m_minLati,
double &m_maxLati,
81 QGeoRectangle &m_bbox)
83 if (m_path.isEmpty()) {
89 m_bbox = QGeoRectangle();
91 }
else if (m_path.size() == 1) {
93 m_deltaXs[0] = m_minX = m_maxX = 0.0;
94 m_minLati = m_maxLati = m_path.at(0).latitude();
95 m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, m_path.at(0).longitude()),
96 QGeoCoordinate(m_minLati, m_path.at(0).longitude()));
98 }
else if ( m_path.size() != m_deltaXs.size() + 1 ) {
99 computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox);
103 const QGeoCoordinate &geoFrom = m_path.at(m_path.size()-2);
104 const QGeoCoordinate &geoTo = m_path.last();
105 double longiFrom = geoFrom.longitude();
106 double longiTo = geoTo.longitude();
107 double deltaLongi = longiTo - longiFrom;
108 if (qAbs(deltaLongi) > 180.0) {
113 deltaLongi = longiTo - longiFrom;
116 m_deltaXs.push_back(m_deltaXs.last() + deltaLongi);
117 double currentMinLongi = m_bbox.topLeft().longitude();
118 double currentMaxLongi = m_bbox.bottomRight().longitude();
119 if (m_deltaXs.last() < m_minX) {
120 m_minX = m_deltaXs.last();
121 currentMinLongi = geoTo.longitude();
123 if (m_deltaXs.last() > m_maxX) {
124 m_maxX = m_deltaXs.last();
125 currentMaxLongi = geoTo.longitude();
127 if (geoTo.latitude() > m_maxLati)
128 m_maxLati = geoTo.latitude();
129 if (geoTo.latitude() < m_minLati)
130 m_minLati = geoTo.latitude();
131 m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, currentMinLongi),
132 QGeoCoordinate(m_minLati, currentMaxLongi));
140 QGeoPathPrivate(
const QList<QGeoCoordinate> &path,
const qreal width = 0.0);
144 virtual QGeoShapePrivate *clone()
const override;
145 virtual bool isValid()
const override;
146 virtual bool isEmpty()
const override;
147 virtual QGeoCoordinate center()
const override;
148 virtual bool operator==(
const QGeoShapePrivate &other)
const override;
149 virtual bool contains(
const QGeoCoordinate &coordinate)
const override;
150 virtual QGeoRectangle boundingGeoRectangle()
const override;
151 size_t hash(size_t seed)
const override;
154 virtual const QList<QGeoCoordinate> &path()
const;
155 virtual bool lineContains(
const QGeoCoordinate &coordinate)
const;
156 virtual qreal width()
const;
157 virtual double length(qsizetype indexFrom, qsizetype indexTo)
const;
158 virtual qsizetype size()
const;
159 virtual QGeoCoordinate coordinateAt(qsizetype index)
const;
160 virtual bool containsCoordinate(
const QGeoCoordinate &coordinate)
const;
162 virtual void setWidth(
const qreal &width);
163 virtual void translate(
double degreesLatitude,
double degreesLongitude);
164 virtual void setPath(
const QList<QGeoCoordinate> &path);
165 virtual void clearPath();
166 virtual void addCoordinate(
const QGeoCoordinate &coordinate);
167 virtual void insertCoordinate(qsizetype index,
const QGeoCoordinate &coordinate);
168 virtual void replaceCoordinate(qsizetype index,
const QGeoCoordinate &coordinate);
169 virtual void removeCoordinate(
const QGeoCoordinate &coordinate);
170 virtual void removeCoordinate(qsizetype index);
171 virtual void computeBoundingBox();
172 virtual void markDirty();
175 QList<QGeoCoordinate> m_path;
177 QGeoRectangle m_bbox;
178 double m_leftBoundWrapped;
179 bool m_bboxDirty =
false;
185 QGeoPathPrivateEager();
186 QGeoPathPrivateEager(
const QList<QGeoCoordinate> &path,
const qreal width = 0.0);
187 ~QGeoPathPrivateEager();
190 virtual QGeoShapePrivate *clone()
const override;
191 virtual void translate(
double degreesLatitude,
double degreesLongitude) override;
194 virtual void markDirty() override;
195 virtual void addCoordinate(
const QGeoCoordinate &coordinate) override;
196 virtual void computeBoundingBox() override;
199 void updateBoundingBox();
202 QList<
double> m_deltaXs;
205 double m_minLati = 0;
206 double m_maxLati = 0;
static void updateBBox(const QList< QGeoCoordinate > &m_path, QList< double > &m_deltaXs, double &m_minX, double &m_maxX, double &m_minLati, double &m_maxLati, QGeoRectangle &m_bbox)
static QT_BEGIN_NAMESPACE void computeBBox(const QList< QGeoCoordinate > &m_path, QList< double > &m_deltaXs, double &m_minX, double &m_maxX, double &m_minLati, double &m_maxLati, QGeoRectangle &m_bbox)