Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgscircularstring.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 QGSCIRCULARSTRING_H
19 : : #define QGSCIRCULARSTRING_H
20 : :
21 : : #include <QVector>
22 : :
23 : : #include "qgis_core.h"
24 : : #include "qgis_sip.h"
25 : : #include "qgscurve.h"
26 : :
27 : :
28 : : /**
29 : : * \ingroup core
30 : : * \class QgsCircularString
31 : : * \brief Circular string geometry type
32 : : * \since QGIS 2.10
33 : : */
34 : 1833 : class CORE_EXPORT QgsCircularString: public QgsCurve
35 : : {
36 : : public:
37 : :
38 : : /**
39 : : * Constructs an empty circular string.
40 : : */
41 : : QgsCircularString() SIP_HOLDGIL;
42 : :
43 : : /**
44 : : * Constructs a circular string with a single
45 : : * arc passing through \a p1, \a p2 and \a p3.
46 : : *
47 : : * \since QGIS 3.2
48 : : */
49 : : QgsCircularString( const QgsPoint &p1,
50 : : const QgsPoint &p2,
51 : : const QgsPoint &p3 ) SIP_HOLDGIL;
52 : :
53 : : /**
54 : : * Creates a circular string with a single arc representing
55 : : * the curve from \a p1 to \a p2 with the specified \a center.
56 : : *
57 : : * If \a useShortestArc is TRUE, then the arc returned will be that corresponding
58 : : * to the shorter arc from \a p1 to \a p2. If it is FALSE, the longer arc from \a p1
59 : : * to \a p2 will be used (i.e. winding the other way around the circle).
60 : : *
61 : : * \since QGIS 3.2
62 : : */
63 : : static QgsCircularString fromTwoPointsAndCenter( const QgsPoint &p1,
64 : : const QgsPoint &p2,
65 : : const QgsPoint ¢er,
66 : : bool useShortestArc = true );
67 : :
68 : : bool equals( const QgsCurve &other ) const override;
69 : :
70 : : QString geometryType() const override SIP_HOLDGIL;
71 : : int dimension() const override SIP_HOLDGIL;
72 : : QgsCircularString *clone() const override SIP_FACTORY;
73 : : void clear() override;
74 : :
75 : : bool fromWkb( QgsConstWkbPtr &wkb ) override;
76 : : bool fromWkt( const QString &wkt ) override;
77 : :
78 : : int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
79 : : QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
80 : : QString asWkt( int precision = 17 ) const override;
81 : : QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
82 : : QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
83 : : json asJsonObject( int precision = 17 ) const override SIP_SKIP;
84 : : bool isEmpty() const override SIP_HOLDGIL;
85 : : bool isValid( QString &error SIP_OUT, int flags = 0 ) const override;
86 : : int numPoints() const override SIP_HOLDGIL;
87 : :
88 : : /**
89 : : * Returns the point at index i within the circular string.
90 : : */
91 : : QgsPoint pointN( int i ) const SIP_HOLDGIL;
92 : :
93 : : void points( QgsPointSequence &pts SIP_OUT ) const override;
94 : :
95 : : /**
96 : : * Sets the circular string's points
97 : : */
98 : : void setPoints( const QgsPointSequence &points );
99 : :
100 : : double length() const override;
101 : : QgsPoint startPoint() const override SIP_HOLDGIL;
102 : : QgsPoint endPoint() const override SIP_HOLDGIL;
103 : : QgsLineString *curveToLine( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY;
104 : : QgsCircularString *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const override SIP_FACTORY;
105 : : bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) override;
106 : :
107 : : void draw( QPainter &p ) const override;
108 : : void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform, bool transformZ = false ) override SIP_THROW( QgsCsException );
109 : : void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
110 : : void addToPainterPath( QPainterPath &path ) const override;
111 : : void drawAsPolygon( QPainter &p ) const override;
112 : : bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
113 : : bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;
114 : : bool deleteVertex( QgsVertexId position ) override;
115 : : double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT, QgsVertexId &vertexAfter SIP_OUT, int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const override;
116 : : bool pointAt( int node, QgsPoint &point, QgsVertexId::VertexType &type ) const override;
117 : : void sumUpArea( double &sum SIP_OUT ) const override;
118 : : bool hasCurvedSegments() const override;
119 : : double vertexAngle( QgsVertexId vertex ) const override;
120 : : double segmentLength( QgsVertexId startVertex ) const override;
121 : : QgsCircularString *reversed() const override SIP_FACTORY;
122 : : QgsPoint *interpolatePoint( double distance ) const override SIP_FACTORY;
123 : : QgsCircularString *curveSubstring( double startDistance, double endDistance ) const override SIP_FACTORY;
124 : : bool addZValue( double zValue = 0 ) override;
125 : : bool addMValue( double mValue = 0 ) override;
126 : : bool dropZValue() override;
127 : : bool dropMValue() override;
128 : : void swapXy() override;
129 : : double xAt( int index ) const override SIP_HOLDGIL;
130 : : double yAt( int index ) const override SIP_HOLDGIL;
131 : :
132 : : bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) override;
133 : :
134 : : #ifndef SIP_RUN
135 : : void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) override;
136 : : void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) override;
137 : :
138 : : /**
139 : : * Cast the \a geom to a QgsCircularString.
140 : : * Should be used by qgsgeometry_cast<QgsCircularString *>( geometry ).
141 : : *
142 : : * \note Not available in Python. Objects will be automatically be converted to the appropriate target type.
143 : : * \since QGIS 3.0
144 : : */
145 : 0 : inline static const QgsCircularString *cast( const QgsAbstractGeometry *geom )
146 : : {
147 : 0 : if ( geom && QgsWkbTypes::flatType( geom->wkbType() ) == QgsWkbTypes::CircularString )
148 : 0 : return static_cast<const QgsCircularString *>( geom );
149 : 0 : return nullptr;
150 : 0 : }
151 : : #endif
152 : :
153 : : QgsCircularString *createEmptyWithSameType() const override SIP_FACTORY;
154 : :
155 : : #ifdef SIP_RUN
156 : : SIP_PYOBJECT __repr__();
157 : : % MethodCode
158 : : QString wkt = sipCpp->asWkt();
159 : : if ( wkt.length() > 1000 )
160 : : wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
161 : : QString str = QStringLiteral( "<QgsCircularString: %1>" ).arg( wkt );
162 : : sipRes = PyUnicode_FromString( str.toUtf8().constData() );
163 : : % End
164 : : #endif
165 : :
166 : : protected:
167 : :
168 : : QgsRectangle calculateBoundingBox() const override;
169 : :
170 : : private:
171 : : QVector<double> mX;
172 : : QVector<double> mY;
173 : : QVector<double> mZ;
174 : : QVector<double> mM;
175 : :
176 : : #if 0
177 : : static void arcTo( QPainterPath &path, QPointF pt1, QPointF pt2, QPointF pt3 );
178 : : #endif
179 : : //bounding box of a single segment
180 : : static QgsRectangle segmentBoundingBox( const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3 );
181 : : static QgsPointSequence compassPointsOnSegment( double p1Angle, double p2Angle, double p3Angle, double centerX, double centerY, double radius );
182 : : static double closestPointOnArc( double x1, double y1, double x2, double y2, double x3, double y3,
183 : : const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf, double epsilon );
184 : : void insertVertexBetween( int after, int before, int pointOnCircle );
185 : : void deleteVertex( int i );
186 : :
187 : : };
188 : :
189 : : // clazy:excludeall=qstring-allocations
190 : :
191 : : #endif // QGSCIRCULARSTRING_H
|