7#include <QtCore/QScopedValueRollback>
11#include <QtGui/private/qtriangulator_p.h>
12#include <QtLocation/private/qgeomap_p.h>
13#include <QtPositioning/private/qlocationutils_p.h>
18#include <QtQuick/private/qquickitem_p.h>
114 m_updatingGeometry(
false)
125 [
this]() {m_d->onGeoGeometryChanged();});
151 m_d->markSourceDirtyAndUpdate();
156 m_d->onLinePropertiesChanged();
179 m_d->onGeoGeometryChanged();
196 if (m_color ==
color)
222 m_d->onGeoGeometryChanged();
246 return m_d->updateMapItemPaintNode(oldNode,
data);
264 if (
event.mapSize.isEmpty())
267 m_d->afterViewportChanged();
275 return m_d->contains(point);
285 if (shape == m_circle)
289 const bool centerHasChanged = circle.
center() != m_circle.
center();
290 const bool radiusHasChanged = circle.
radius() != m_circle.
radius();
293 m_d->onGeoGeometryChanged();
294 if (centerHasChanged)
296 if (radiusHasChanged)
305 if (!
map() || !m_circle.
isValid() || m_updatingGeometry || newGeometry == oldGeometry) {
312 if (newCoordinate.isValid())
357 const qreal poleLat = 90;
360 const bool crossNorthPole = distanceToNorthPole <
distance;
361 const bool crossSouthPole = distanceToSouthPole <
distance;
363 if (!crossNorthPole && !crossSouthPole)
366 if (crossNorthPole && crossSouthPole)
370 const qreal xAtBorder = cameraRect.left();
377 for (
auto &
c :
path) {
379 while (
c.x() - xAtBorder > 1.0)
381 while (
c.x() - xAtBorder < 0.0)
387 {return a.x() < b.x();});
389 const qreal newPoleLat = crossNorthPole ? -0.1 : 1.1;
404 qreal distanceToNorthPole = center.distanceTo(northPole);
405 qreal distanceToSouthPole = center.distanceTo(southPole);
406 return (distanceToNorthPole <
distance? 1 : 0) +
407 (distanceToSouthPole <
distance? 1 : 0);
416 const double lambda = 0.0001;
418 const double lambda_geo = center.distanceTo(
p.mapProjectionToGeo(
c +
QDoubleVector2D(lambda, 0)));
421 for (
int i = 0;
i < steps; ++
i) {
438 steps =
qMax(steps, 3);
439 qreal centerLon = center.longitude();
442 qreal cosLatRad = std::cos(latRad);
443 qreal sinLatRad = std::sin(latRad);
445 qreal cosRatio = std::cos(ratio);
446 qreal sinRatio = std::sin(ratio);
447 qreal sinLatRad_x_cosRatio = sinLatRad * cosRatio;
448 qreal cosLatRad_x_sinRatio = cosLatRad * sinRatio;
449 for (
int i = 0;
i < steps; ++
i) {
450 const qreal azimuthRad = 2 *
M_PI *
i / steps;
451 const qreal resultLatRad = std::asin(sinLatRad_x_cosRatio
452 + cosLatRad_x_sinRatio * std::cos(azimuthRad));
453 const qreal resultLonRad = lonRad + std::atan2(std::sin(azimuthRad) * cosLatRad_x_sinRatio,
454 cosRatio - sinLatRad * std::sin(resultLatRad));
460 while (lon2 > 180.0) {
464 while (lon2 < -180.0) {
485 QScopedValueRollback<bool> rollback(
m_circle.m_updatingGeometry);
495 if (crossingPoles == 1) {
499 else if (crossingPoles == 2) {
503 const qreal centerX =
p.geoToMapProjection(center).x();
504 for (
int i = 0;
i < circlePath.count();
i++) {
505 if (circlePath.at(
i).x() > centerX)
506 circlePath[
i].setX(circlePath.at(
i).x() - 1.0);
511 QList<QDoubleVector2D> surroundingRect;
512 if (cameraRect.contains(circleRect)){
513 cameraRect = cameraRect.adjusted(-0.1, -0.1, 0.2, 0.2);
514 surroundingRect = {{cameraRect.left(), cameraRect.top()}, {cameraRect.right(), cameraRect.top()},
515 {cameraRect.right(), cameraRect.bottom()}, {cameraRect.left() , cameraRect.bottom()}};
517 const qreal anchorRect = centerX;
519 surroundingRect = {{anchorRect, -0.1}, {anchorRect + 1.0, -0.1},
520 {anchorRect + 1.0, 1.1}, {anchorRect, 1.1}};
531 const float borderWidth = hasBorder ?
m_circle.m_border.
width() : 0.0f;
538 path.
translate(-bb.left() + borderWidth, -bb.top() + borderWidth);
The QColor class provides colors based on RGB, HSV or CMYK values.
int alpha() const noexcept
Returns the alpha color component of this color.
QQuickShapePath * m_shapePath
QGeoMapCircleGeometry m_geometry
QSGNode * updateMapItemPaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) override
~QDeclarativeCircleMapItemPrivateCPU() override
QDeclarativeGeoMapPainterPath * m_painterPath
void updatePolish() override
bool contains(const QPointF &point) const override
QDeclarativeCircleMapItemPrivateCPU(QDeclarativeCircleMapItem &circle)
static void calculatePeripheralPointsGreatCircle(QList< QDoubleVector2D > &path, const QGeoCoordinate ¢er, qreal distance, const QGeoProjectionWebMercator &p, int steps)
static void calculatePeripheralPointsSimple(QList< QDoubleVector2D > &path, const QGeoCoordinate ¢er, qreal distance, const QGeoProjectionWebMercator &p, int steps)
virtual ~QDeclarativeCircleMapItemPrivate()
QDeclarativeCircleMapItem & m_circle
static void includeOnePoleInPath(QList< QDoubleVector2D > &path, const QGeoCoordinate ¢er, qreal distance, const QGeoProjectionWebMercator &p)
static int crossEarthPole(const QGeoCoordinate ¢er, qreal distance)
QList< QDoubleVector2D > m_circlePath
void setGeoShape(const QGeoShape &shape) override
const QGeoShape & geoShape() const override
void setColor(const QColor &color)
\qmlproperty color MapCircle::color
void onLinePropertiesChanged()
void updatePolish() override
QSGNode * updateMapItemPaintNode(QSGNode *, UpdatePaintNodeData *) override
\qmlproperty real MapCircle::opacity
void setCenter(const QGeoCoordinate ¢er)
\qmlproperty coordinate MapCircle::center
~QDeclarativeCircleMapItem() override
void markSourceDirtyAndUpdate()
void setMap(QDeclarativeGeoMap *quickMap, QGeoMap *map) override
void setRadius(qreal radius)
\qmlproperty real MapCircle::radius
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
void radiusChanged(qreal radius)
void afterViewportChanged(const QGeoMapViewportChangeEvent &event) override
bool contains(const QPointF &point) const override
QDeclarativeMapLineProperties * border
\qmlpropertygroup Location::MapCircle::border \qmlproperty int MapCircle::border.width \qmlproperty c...
QDeclarativeCircleMapItem(QQuickItem *parent=nullptr)
void centerChanged(const QGeoCoordinate ¢er)
virtual void setPositionOnMap(const QGeoCoordinate &coordinate, const QPointF &offset)
QGeoMap::ItemType m_itemType
void setShapeTriangulationScale(QQuickShape *shape, qreal maxCoord) const
float zoomLevelOpacity() const
virtual void setMap(QDeclarativeGeoMap *quickMap, QGeoMap *map)
void referenceSurfaceChanged()
QLocation::ReferenceSurface referenceSurface
QDeclarativeGeoMap * quickMap() const
void setPath(const QPainterPath &path)
void widthChanged(qreal width)
void colorChanged(const QColor &color)
void setCenter(const QGeoCoordinate ¢er)
Sets the center coordinate of this geo circle to center.
QGeoCoordinate center
This property holds the center coordinate for the geo circle.
qreal radius
This property holds the circle radius in meters.
void setRadius(qreal radius)
Sets the radius in meters of this geo circle to radius.
QRectF sourceBoundingBox() const
const QGeoCoordinate & origin() const
bool isScreenDirty() const
QPainterPath srcPath() const
void updateSourcePoints(const QGeoMap &map, const QList< QList< QDoubleVector2D > > &path, MapBorderBehaviour wrapping=Duplicate)
const QGeoProjection & geoProjection() const
virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport=true) const =0
bool isValid
This property holds the validity of the geo shape.
static double radians(double degrees)
static double degrees(double radians)
static double earthMeanRadius()
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Q_WEAK_OVERLOAD void setObjectName(const QString &name)
Sets the object's name to name.
void translate(qreal dx, qreal dy)
Translates all elements in the path by ({dx}, {dy}).
\inmodule QtCore\reentrant
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
void setSize(const QSizeF &size)
void setFlag(Flag flag, bool enabled=true)
Enables the specified flag for this item if enabled is true; if enabled is false, the flag is disable...
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
Q_INVOKABLE QPointF mapToItem(const QQuickItem *item, const QPointF &point) const
Maps the given point in this item's coordinate system to the equivalent point within item's coordinat...
qreal x
\qmlproperty real QtQuick::Item::x \qmlproperty real QtQuick::Item::y \qmlproperty real QtQuick::Item...
qreal y
Defines the item's y position relative to its parent.
qreal width
This property holds the width of this item.
qreal height
This property holds the height of this item.
QQmlListProperty< QQuickPathElement > pathElements
\qmlproperty list<PathElement> QtQuick::Path::pathElements This property holds the objects composing ...
void setStrokeColor(const QColor &color)
void setStrokeWidth(qreal w)
void setFillColor(const QColor &color)
bool contains(const QPointF &point) const override
\qmlmethod bool QtQuick::Item::contains(point point)
void setContainsMode(ContainsMode containsMode)
FINALQQmlListProperty< QObject > data
\qmlproperty list<Object> QtQuick.Shapes::Shape::data
\inmodule QtCore\reentrant
\group qtquick-scenegraph-nodes \title Qt Quick Scene Graph Node classes
The QVector2D class represents a vector or vertex in 2D space.
QMap< QString, QString > map
[6]
QRectF boundingRectangleFromList(const QList< QDoubleVector2D > &list)
Combined button and popup list for selecting options.
constexpr const T & qMax(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLsizei GLsizei GLfloat distance
GLenum GLuint GLintptr offset
GLsizei const GLchar *const * path
\qmltype MapCircle \instantiates QDeclarativeCircleMapItem \inqmlmodule QtLocation