178bool QGeoCirclePrivate::contains(
const QGeoCoordinate &coordinate)
const
180 if (!isValid() || !coordinate.isValid())
184 qreal distance = m_center.distanceTo(coordinate);
185 if (qFuzzyCompare(distance, m_radius) || distance <= m_radius)
201void QGeoCirclePrivate::updateBoundingBox()
204 if (m_center.isValid()) {
205 m_bbox.setTopLeft(m_center);
206 m_bbox.setBottomRight(m_center);
211 bool crossNorth = crossNorthPole();
212 bool crossSouth = crossSouthPole();
214 if (crossNorth && crossSouth) {
216 m_bbox = QGeoRectangle(QGeoCoordinate(90.0, -180.0), QGeoCoordinate(-90.0, 180.0));
217 }
else if (crossNorth) {
219 m_bbox = QGeoRectangle(QGeoCoordinate(90.0, -180.0), QGeoCoordinate(m_center.atDistanceAndAzimuth(m_radius, 180.0).latitude(), 180.0));
220 }
else if (crossSouth) {
221 m_bbox = QGeoRectangle(QGeoCoordinate(m_center.atDistanceAndAzimuth(m_radius, 0.0).latitude(), -180.0), QGeoCoordinate(-90, 180.0));
245 double r_in_rad = m_radius / QLocationUtils::earthMeanRadius();
246 double lat_delta_in_deg = QLocationUtils::degrees(r_in_rad);
247 double lon_delta_in_deg = QLocationUtils::degrees(std::asin(
249 std::cos(QLocationUtils::radians(m_center.latitude()))
252 QGeoCoordinate topLeft;
253 topLeft.setLatitude(QLocationUtils::clipLat(m_center.latitude() + lat_delta_in_deg));
254 topLeft.setLongitude(QLocationUtils::wrapLong(m_center.longitude() - lon_delta_in_deg));
255 QGeoCoordinate bottomRight;
256 bottomRight.setLatitude(QLocationUtils::clipLat(m_center.latitude() - lat_delta_in_deg));
257 bottomRight.setLongitude(QLocationUtils::wrapLong(m_center.longitude() + lon_delta_in_deg));
259 m_bbox = QGeoRectangle(topLeft, bottomRight);
275bool QGeoCirclePrivate::crossNorthPole()
const
277 const QGeoCoordinate northPole(90.0, m_center.longitude());
278 qreal distanceToPole = m_center.distanceTo(northPole);
279 if (distanceToPole < m_radius)
284bool QGeoCirclePrivate::crossSouthPole()
const
286 const QGeoCoordinate southPole(-90.0, m_center.longitude());
287 qreal distanceToPole = m_center.distanceTo(southPole);
288 if (distanceToPole < m_radius)
310void QGeoCircle::translate(
double degreesLatitude,
double degreesLongitude)
316 double lat = d->m_center.latitude();
317 double lon = d->m_center.longitude();
319 lat += degreesLatitude;
320 lon += degreesLongitude;
321 lon = QLocationUtils::wrapLong(lon);
340 d->setCenter(QGeoCoordinate(lat, lon));
397QGeoCirclePrivate::QGeoCirclePrivate(
const QGeoCoordinate ¢er, qreal radius)
398: QGeoShapePrivate(QGeoShape::CircleType), m_center(center), m_radius(radius)
403QGeoCirclePrivate::QGeoCirclePrivate(
const QGeoCirclePrivate &other)
404: QGeoShapePrivate(QGeoShape::CircleType), m_center(other.m_center),
405 m_radius(other.m_radius), m_bbox(other.m_bbox)
416bool QGeoCirclePrivate::operator==(
const QGeoShapePrivate &other)
const
418 if (!QGeoShapePrivate::operator==(other))
421 const QGeoCirclePrivate &otherCircle =
static_cast<
const QGeoCirclePrivate &>(other);
423 return m_radius == otherCircle.m_radius && m_center == otherCircle.m_center;