28inline static void computeBBox(
const QList<QGeoCoordinate> &m_path, QList<
double> &m_deltaXs,
29 double &m_minX,
double &m_maxX,
double &m_minLati,
double &m_maxLati,
30 QGeoRectangle &m_bbox)
32 if (m_path.isEmpty()) {
38 m_bbox = QGeoRectangle();
42 m_minLati = m_maxLati = m_path.at(0).latitude();
45 m_deltaXs.resize(m_path.size());
46 m_deltaXs[0] = m_minX = m_maxX = 0.0;
48 for (qsizetype i = 1; i < m_path.size(); i++) {
49 const QGeoCoordinate &geoFrom = m_path.at(i-1);
50 const QGeoCoordinate &geoTo = m_path.at(i);
51 double longiFrom = geoFrom.longitude();
52 double longiTo = geoTo.longitude();
53 double deltaLongi = longiTo - longiFrom;
54 if (qAbs(deltaLongi) > 180.0) {
59 deltaLongi = longiTo - longiFrom;
61 m_deltaXs[i] = m_deltaXs[i-1] + deltaLongi;
62 if (m_deltaXs[i] < m_minX) {
63 m_minX = m_deltaXs[i];
66 if (m_deltaXs[i] > m_maxX) {
67 m_maxX = m_deltaXs[i];
70 if (geoTo.latitude() > m_maxLati)
71 m_maxLati = geoTo.latitude();
72 if (geoTo.latitude() < m_minLati)
73 m_minLati = geoTo.latitude();
76 m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, m_path.at(minId).longitude()),
77 QGeoCoordinate(m_minLati, m_path.at(maxId).longitude()));
80inline static void updateBBox(
const QList<QGeoCoordinate> &m_path, QList<
double> &m_deltaXs,
81 double &m_minX,
double &m_maxX,
double &m_minLati,
double &m_maxLati,
82 QGeoRectangle &m_bbox)
84 if (m_path.isEmpty()) {
90 m_bbox = QGeoRectangle();
92 }
else if (m_path.size() == 1) {
94 m_deltaXs[0] = m_minX = m_maxX = 0.0;
95 m_minLati = m_maxLati = m_path.at(0).latitude();
96 m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, m_path.at(0).longitude()),
97 QGeoCoordinate(m_minLati, m_path.at(0).longitude()));
99 }
else if ( m_path.size() != m_deltaXs.size() + 1 ) {
100 computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox);
104 const QGeoCoordinate &geoFrom = m_path.at(m_path.size()-2);
105 const QGeoCoordinate &geoTo = m_path.last();
106 double longiFrom = geoFrom.longitude();
107 double longiTo = geoTo.longitude();
108 double deltaLongi = longiTo - longiFrom;
109 if (qAbs(deltaLongi) > 180.0) {
114 deltaLongi = longiTo - longiFrom;
117 m_deltaXs.push_back(m_deltaXs.last() + deltaLongi);
118 double currentMinLongi = m_bbox.topLeft().longitude();
119 double currentMaxLongi = m_bbox.bottomRight().longitude();
120 if (m_deltaXs.last() < m_minX) {
121 m_minX = m_deltaXs.last();
122 currentMinLongi = geoTo.longitude();
124 if (m_deltaXs.last() > m_maxX) {
125 m_maxX = m_deltaXs.last();
126 currentMaxLongi = geoTo.longitude();
128 if (geoTo.latitude() > m_maxLati)
129 m_maxLati = geoTo.latitude();
130 if (geoTo.latitude() < m_minLati)
131 m_minLati = geoTo.latitude();
132 m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, currentMinLongi),
133 QGeoCoordinate(m_minLati, currentMaxLongi));
144 QGeoPathPrivateBase();
145 QGeoPathPrivateBase(
const QList<QGeoCoordinate> &path);
146 ~QGeoPathPrivateBase() override;
149 bool isValid()
const override;
150 bool isEmpty()
const override;
151 QGeoCoordinate center()
const override;
152 bool operator==(
const QGeoShapePrivate &other)
const override;
153 QGeoRectangle boundingGeoRectangle()
const override;
154 size_t hash(size_t seed)
const override;
157 virtual const QList<QGeoCoordinate> &path()
const;
158 virtual double length(qsizetype indexFrom, qsizetype indexTo)
const;
159 virtual qsizetype size()
const;
160 virtual QGeoCoordinate coordinateAt(qsizetype index)
const;
161 virtual bool containsCoordinate(
const QGeoCoordinate &coordinate)
const;
162 virtual void translate(
double degreesLatitude,
double degreesLongitude);
163 virtual void setPath(
const QList<QGeoCoordinate> &path);
164 virtual void clearPath();
165 virtual void addCoordinate(
const QGeoCoordinate &coordinate);
166 virtual void insertCoordinate(qsizetype index,
const QGeoCoordinate &coordinate);
167 virtual void replaceCoordinate(qsizetype index,
const QGeoCoordinate &coordinate);
168 virtual void removeCoordinate(
const QGeoCoordinate &coordinate);
169 virtual void removeCoordinate(qsizetype index);
170 virtual void computeBoundingBox();
171 virtual void markDirty();
174 QList<QGeoCoordinate> m_path;
175 QGeoRectangle m_bbox;
176 double m_leftBoundWrapped;
177 bool m_bboxDirty =
false;
208 QGeoPathPrivateEager();
209 QGeoPathPrivateEager(
const QList<QGeoCoordinate> &path,
const qreal width = 0.0);
210 ~QGeoPathPrivateEager();
213 QGeoShapePrivate *clone()
const override;
216 void translate(
double degreesLatitude,
double degreesLongitude) override;
217 void markDirty() override;
218 void addCoordinate(
const QGeoCoordinate &coordinate) override;
219 void computeBoundingBox() override;
222 void updateBoundingBox();
225 QList<
double> m_deltaXs;
228 double m_minLati = 0;
229 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)