179bool QGeoCirclePrivate::contains(
const QGeoCoordinate &coordinate)
const
181 if (!isValid() || !coordinate.isValid())
185 qreal distance = m_center.distanceTo(coordinate);
186 if (distance <= m_radius || QtPrivate::fuzzyCompare(distance, m_radius))
202void QGeoCirclePrivate::updateBoundingBox()
205 if (m_center.isValid()) {
206 m_bbox.setTopLeft(m_center);
207 m_bbox.setBottomRight(m_center);
212 bool crossNorth = crossNorthPole();
213 bool crossSouth = crossSouthPole();
215 if (crossNorth && crossSouth) {
217 m_bbox = QGeoRectangle(QGeoCoordinate(90.0, -180.0), QGeoCoordinate(-90.0, 180.0));
218 }
else if (crossNorth) {
220 m_bbox = QGeoRectangle(QGeoCoordinate(90.0, -180.0), QGeoCoordinate(m_center.atDistanceAndAzimuth(m_radius, 180.0).latitude(), 180.0));
221 }
else if (crossSouth) {
222 m_bbox = QGeoRectangle(QGeoCoordinate(m_center.atDistanceAndAzimuth(m_radius, 0.0).latitude(), -180.0), QGeoCoordinate(-90, 180.0));
246 double r_in_rad = m_radius / QLocationUtils::earthMeanRadius();
247 double lat_delta_in_deg = QLocationUtils::degrees(r_in_rad);
248 double lon_delta_in_deg = QLocationUtils::degrees(std::asin(
250 std::cos(QLocationUtils::radians(m_center.latitude()))
253 QGeoCoordinate topLeft;
254 topLeft.setLatitude(QLocationUtils::clipLat(m_center.latitude() + lat_delta_in_deg));
255 topLeft.setLongitude(QLocationUtils::wrapLong(m_center.longitude() - lon_delta_in_deg));
256 QGeoCoordinate bottomRight;
257 bottomRight.setLatitude(QLocationUtils::clipLat(m_center.latitude() - lat_delta_in_deg));
258 bottomRight.setLongitude(QLocationUtils::wrapLong(m_center.longitude() + lon_delta_in_deg));
260 m_bbox = QGeoRectangle(topLeft, bottomRight);
276bool QGeoCirclePrivate::crossNorthPole()
const
278 const QGeoCoordinate northPole(90.0, m_center.longitude());
279 qreal distanceToPole = m_center.distanceTo(northPole);
280 if (distanceToPole < m_radius)
285bool QGeoCirclePrivate::crossSouthPole()
const
287 const QGeoCoordinate southPole(-90.0, m_center.longitude());
288 qreal distanceToPole = m_center.distanceTo(southPole);
289 if (distanceToPole < m_radius)
311void QGeoCircle::translate(
double degreesLatitude,
double degreesLongitude)
317 double lat = d->m_center.latitude();
318 double lon = d->m_center.longitude();
320 lat += degreesLatitude;
321 lon += degreesLongitude;
322 lon = QLocationUtils::wrapLong(lon);
341 d->setCenter(QGeoCoordinate(lat, lon));
398QGeoCirclePrivate::QGeoCirclePrivate(
const QGeoCoordinate ¢er, qreal radius)
399: QGeoShapePrivate(QGeoShape::CircleType), m_center(center), m_radius(radius)
404QGeoCirclePrivate::QGeoCirclePrivate(
const QGeoCirclePrivate &other)
405: QGeoShapePrivate(QGeoShape::CircleType), m_center(other.m_center),
406 m_radius(other.m_radius), m_bbox(other.m_bbox)
417bool QGeoCirclePrivate::operator==(
const QGeoShapePrivate &other)
const
419 if (!QGeoShapePrivate::operator==(other))
422 const QGeoCirclePrivate &otherCircle =
static_cast<
const QGeoCirclePrivate &>(other);
424 return m_radius == otherCircle.m_radius && m_center == otherCircle.m_center;