QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgscurve.h
Go to the documentation of this file.
1/***************************************************************************
2 qgscurve.h
3 ------------
4 begin : September 2014
5 copyright : (C) 2014 by Marco Hugentobler
6 email : marco at sourcepole dot ch
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#ifndef QGSCURVE_H
19#define QGSCURVE_H
20
21#include "qgis_core.h"
22#include "qgis_sip.h"
23#include "qgsabstractgeometry.h"
24#include "qgsbox3d.h"
25#include <QPainterPath>
26
27class QgsLineString;
28
34class CORE_EXPORT QgsCurve: public QgsAbstractGeometry SIP_ABSTRACT
35{
36 public:
37
41 QgsCurve() = default;
42
46 virtual bool equals( const QgsCurve &other ) const = 0;
47
48 bool operator==( const QgsAbstractGeometry &other ) const override;
49 bool operator!=( const QgsAbstractGeometry &other ) const override;
50
51 QgsCurve *clone() const override = 0 SIP_FACTORY;
52
57 virtual QgsPoint startPoint() const = 0;
58
63 virtual QgsPoint endPoint() const = 0;
64
70 virtual bool isClosed() const SIP_HOLDGIL;
71
81 virtual bool isClosed2D() const SIP_HOLDGIL;
82
86 virtual bool isRing() const SIP_HOLDGIL;
87
97 virtual QgsLineString *curveToLine( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const = 0 SIP_FACTORY;
98
102 virtual void addToPainterPath( QPainterPath &path ) const = 0;
103 QPainterPath asQPainterPath() const override;
104
109 virtual void drawAsPolygon( QPainter &p ) const = 0;
110
114 virtual void points( QgsPointSequence &pt SIP_OUT ) const = 0;
115
119 virtual int numPoints() const = 0;
120
121#ifdef SIP_RUN
122 int __len__() const;
123 % Docstring
124 Returns the number of points in the curve.
125 % End
126 % MethodCode
127 sipRes = sipCpp->numPoints();
128 % End
129
131 int __bool__() const;
132 % MethodCode
133 sipRes = true;
134 % End
135#endif
136
140 virtual void sumUpArea( double &sum SIP_OUT ) const = 0;
141
143 bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
144 void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const override;
145 int vertexNumberFromVertexId( QgsVertexId id ) const override;
146
154 virtual bool pointAt( int node, QgsPoint &point SIP_OUT, Qgis::VertexType &type SIP_OUT ) const = 0;
155
166 virtual int indexOf( const QgsPoint &point ) const = 0;
167
171 virtual QgsCurve *reversed() const = 0 SIP_FACTORY;
172
173 QgsAbstractGeometry *boundary() const override SIP_FACTORY;
174
175 QString asKml( int precision = 17 ) const override;
176
182 QgsCurve *segmentize( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY;
183
184 int vertexCount( int part = 0, int ring = 0 ) const override;
185 int ringCount( int part = 0 ) const override;
186 int partCount() const override;
187 QgsPoint vertexAt( QgsVertexId id ) const override;
188 QgsCurve *toCurveType() const override SIP_FACTORY;
189 void normalize() final SIP_HOLDGIL;
190
191 QgsBox3D boundingBox3D() const override;
192 bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const override;
193
199 virtual double xAt( int index ) const = 0;
200
206 virtual double yAt( int index ) const = 0;
207
214 virtual double zAt( int index ) const = 0;
215
222 virtual double mAt( int index ) const = 0;
223
227 virtual QPolygonF asQPolygonF() const;
228
240 virtual QgsPoint *interpolatePoint( double distance ) const = 0 SIP_FACTORY;
241
254 virtual QgsCurve *curveSubstring( double startDistance, double endDistance ) const = 0 SIP_FACTORY;
255
263 double straightDistance2d() const;
264
274 double sinuosity() const;
275
283 Qgis::AngularDirection orientation() const;
284
296 virtual void scroll( int firstVertexIndex ) = 0;
297
298#ifndef SIP_RUN
299
306 inline static const QgsCurve *cast( const QgsAbstractGeometry *geom )
307 {
308 if ( !geom )
309 return nullptr;
310
311 const Qgis::WkbType type = geom->wkbType();
313 {
314 return static_cast<const QgsCurve *>( geom );
315 }
316 return nullptr;
317 }
318
329 virtual std::tuple< std::unique_ptr< QgsCurve >, std::unique_ptr< QgsCurve > > splitCurveAtVertex( int index ) const = 0;
330
331#endif
332
333
334 protected:
335
336 void clearCache() const override;
337
338 int childCount() const override;
339 QgsPoint childPoint( int index ) const override;
340#ifndef SIP_RUN
341
346 bool snapToGridPrivate( double hSpacing, double vSpacing, double dSpacing, double mSpacing,
347 const QVector<double> &srcX, const QVector<double> &srcY, const QVector<double> &srcZ, const QVector<double> &srcM,
348 QVector<double> &outX, QVector<double> &outY, QVector<double> &outZ, QVector<double> &outM ) const;
349#endif
350
355
356 mutable bool mHasCachedSummedUpArea = false;
357 mutable double mSummedUpArea = 0;
358
359 private:
360
361 mutable bool mHasCachedValidity = false;
362 mutable QString mValidityFailureReason;
363
364 friend class TestQgsGeometry;
365};
366
367#endif // QGSCURVE_H
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:54
VertexType
Types of vertex.
Definition: qgis.h:2477
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition: qgis.h:182
Abstract base class for all geometries.
virtual QgsPoint childPoint(int index) const
Returns point at index (for geometries without child geometries - i.e.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
virtual int vertexNumberFromVertexId(QgsVertexId id) const =0
Returns the vertex number corresponding to a vertex id.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
virtual int childCount() const
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
virtual void clearCache() const
Clears any cached parameters associated with the geometry, e.g., bounding boxes.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual bool operator!=(const QgsAbstractGeometry &other) const =0
virtual QgsCoordinateSequence coordinateSequence() const =0
Retrieves the sequence of geometries, rings and nodes.
virtual bool operator==(const QgsAbstractGeometry &other) const =0
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
A 3-dimensional box composed of x, y, z coordinates.
Definition: qgsbox3d.h:43
Abstract base class for curved geometry type.
Definition: qgscurve.h:35
virtual bool equals(const QgsCurve &other) const =0
Checks whether this curve exactly equals another curve.
virtual bool pointAt(int node, QgsPoint &point, Qgis::VertexType &type) const =0
Returns the point and vertex id of a point within the curve.
static const QgsCurve * cast(const QgsAbstractGeometry *geom)
Cast the geom to a QgsCurve.
Definition: qgscurve.h:306
virtual int indexOf(const QgsPoint &point) const =0
Returns the index of the first vertex matching the given point, or -1 if a matching vertex is not fou...
virtual void sumUpArea(double &sum) const =0
Sums up the area of the curve by iterating over the vertices (shoelace formula).
QgsBox3D mBoundingBox
Cached bounding box.
Definition: qgscurve.h:354
QgsCurve * clone() const override=0
Clones the geometry by performing a deep copy.
virtual QgsPoint startPoint() const =0
Returns the starting point of the curve.
virtual std::tuple< std::unique_ptr< QgsCurve >, std::unique_ptr< QgsCurve > > splitCurveAtVertex(int index) const =0
Splits the curve at the specified vertex index, returning two curves which represent the portion of t...
virtual QgsCurve * reversed() const =0
Returns a reversed copy of the curve, where the direction of the curve has been flipped.
virtual QgsPoint endPoint() const =0
Returns the end point of the curve.
QgsCurve()=default
Constructor for QgsCurve.
Line string geometry type, with support for z-dimension and m-values.
Definition: qgslinestring.h:45
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
Definition: qgswkbtypes.h:862
static bool isSingleType(Qgis::WkbType type)
Returns true if the WKB type is a single type.
Definition: qgswkbtypes.h:748
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_ABSTRACT
Definition: qgis_sip.h:213
#define SIP_HOLDGIL
Definition: qgis_sip.h:171
#define SIP_FACTORY
Definition: qgis_sip.h:76
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPoint > QgsPointSequence
int precision
Utility class for identifying a unique vertex within a geometry.
Definition: qgsvertexid.h:30