/*! \internal */ void QGeoMapRectangleGeometry::updatePoints(const QGeoMap &map, const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight) { if (!screenDirty_ && !sourceDirty_) return; QDoubleVector2D tl = map.coordinateToItemPosition(topLeft, false); QDoubleVector2D br = map.coordinateToItemPosition(bottomRight, false); // We can get NaN if the map isn't set up correctly, or the projection // is faulty -- probably best thing to do is abort if (!qIsFinite(tl.x()) || !qIsFinite(tl.y())) return; if (!qIsFinite(br.x()) || !qIsFinite(br.y())) return; if ( preserveGeometry_ ) { double unwrapBelowX = map.coordinateToItemPosition(geoLeftBound_, false).x(); if (br.x() < unwrapBelowX) br.setX(tl.x() + screenBounds_.width()); } QRectF re(tl.toPointF(), br.toPointF()); re.translate(-1 * tl.toPointF()); clear(); screenVertices_.reserve(6); screenVertices_ << re.topLeft(); screenVertices_ << re.topRight(); screenVertices_ << re.bottomLeft(); screenVertices_ << re.topRight(); screenVertices_ << re.bottomLeft(); screenVertices_ << re.bottomRight(); firstPointOffset_ = QPointF(0,0); srcOrigin_ = topLeft; screenBounds_ = re; screenOutline_ = QPainterPath(); screenOutline_.addRect(re); geoLeftBound_ = topLeft; }
/*! \internal */ void QGeoMapPolylineGeometry::updateSourcePoints(const QGeoMap &map, const QList<QGeoCoordinate> &path) { bool foundValid = false; double minX = -1.0; double minY = -1.0; double maxX = -1.0; double maxY = -1.0; if (!sourceDirty_) return; // clear the old data and reserve enough memory srcPoints_.clear(); srcPoints_.reserve(path.size() * 2); srcPointTypes_.clear(); srcPointTypes_.reserve(path.size()); QDoubleVector2D origin, lastPoint, lastAddedPoint; double unwrapBelowX = 0; if (preserveGeometry_) unwrapBelowX = map.coordinateToScreenPosition(geoLeftBound_, false).x(); for (int i = 0; i < path.size(); ++i) { const QGeoCoordinate &coord = path.at(i); if (!coord.isValid()) continue; QDoubleVector2D point = map.coordinateToScreenPosition(coord, false); // We can get NaN if the map isn't set up correctly, or the projection // is faulty -- probably best thing to do is abort if (!qIsFinite(point.x()) || !qIsFinite(point.y())) return; // unwrap x to preserve geometry if moved to border of map if (preserveGeometry_ && point.x() < unwrapBelowX && !qFuzzyCompare(point.x(), unwrapBelowX)) point.setX(unwrapBelowX + geoDistanceToScreenWidth(map, geoLeftBound_, coord)); if (!foundValid) { foundValid = true; srcOrigin_ = coord; origin = point; point = QDoubleVector2D(0,0); minX = point.x(); maxX = minX; minY = point.y(); maxY = minY; srcPoints_ << point.x() << point.y(); srcPointTypes_ << QPainterPath::MoveToElement; lastAddedPoint = point; } else { point -= origin; minX = qMin(point.x(), minX); minY = qMin(point.y(), minY); maxX = qMax(point.x(), maxX); maxY = qMax(point.y(), maxY); if ((point - lastAddedPoint).manhattanLength() > 3 || i == path.size() - 1) { srcPoints_ << point.x() << point.y(); srcPointTypes_ << QPainterPath::LineToElement; lastAddedPoint = point; } } lastPoint = point; } sourceBounds_ = QRectF(QPointF(minX, minY), QPointF(maxX, maxY)); geoLeftBound_ = map.screenPositionToCoordinate( QDoubleVector2D(minX + origin.x(), minY + origin.y()), false); }