QGIS API Documentation  3.17.0-Master (ca637cfeb2)
qgsinternalgeometryengine.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsinternalgeometryengine.h - QgsInternalGeometryEngine
3 
4  ---------------------
5  begin : 13.1.2016
6  copyright : (C) 2016 by Matthias Kuhn
7  email : [email protected]
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 #ifndef QGSINTERNALGEOMETRYENGINE_H
17 #define QGSINTERNALGEOMETRYENGINE_H
18 
19 #define SIP_NO_FILE
20 
21 #include <functional>
22 
23 #include "qgspointxy.h"
24 
25 class QgsGeometry;
27 class QgsLineString;
28 class QgsLineSegment2D;
29 class QgsFeedback;
30 
42 {
43  public:
44 
50  explicit QgsInternalGeometryEngine( const QgsGeometry &geometry );
51 
57  QString lastError() const;
58 
67  QgsGeometry extrude( double x, double y ) const;
68 
78  QgsGeometry poleOfInaccessibility( double precision, double *distanceFromBoundary = nullptr ) const;
79 
88  QgsGeometry orthogonalize( double tolerance = 1.0E-8, int maxIterations = 1000, double angleThreshold = 15.0 ) const;
89 
98  QgsGeometry densifyByCount( int extraNodesPerSegment ) const;
99 
113  QgsGeometry densifyByDistance( double distance ) const;
114 
129  QgsGeometry variableWidthBuffer( int segments, const std::function< std::unique_ptr< double[] >( const QgsLineString *line ) > &widthFunction ) const;
130 
145  QgsGeometry taperedBuffer( double startWidth, double endWidth, int segments ) const;
146 
157  QgsGeometry variableWidthBufferByM( int segments ) const;
158 
179  static QVector< QgsPointXY > randomPointsInPolygon( const QgsGeometry &polygon, int count,
180  const std::function< bool( const QgsPointXY & ) > &acceptPoint, unsigned long seed = 0, QgsFeedback *feedback = nullptr, int maxTriesPerPoint = 0 );
181 
197  QgsGeometry convertToCurves( double distanceTolerance, double angleTolerance ) const;
198 
209  QgsGeometry orientedMinimumBoundingBox( double &area SIP_OUT, double &angle SIP_OUT, double &width SIP_OUT, double &height SIP_OUT ) const;
210 
211  private:
212  const QgsAbstractGeometry *mGeometry = nullptr;
213 
214  mutable QString mLastError;
215 };
216 
223 class CORE_EXPORT QgsRay2D
224 {
225  public:
226 
231  QgsRay2D( const QgsPointXY &origin, QgsVector direction )
232  : origin( origin )
233  , direction( direction )
234  {}
235 
243  bool intersects( const QgsLineSegment2D &segment, QgsPointXY &intersectPoint ) const;
244 
245  private:
246 
247  QgsPointXY origin;
248  QgsVector direction;
249 };
250 
252 
253 // adapted for QGIS geometry classes from original work at https://github.com/trylock/visibility by trylock
254 
263 class CORE_EXPORT QgsLineSegmentDistanceComparer
264 {
265  public:
266 
271  explicit QgsLineSegmentDistanceComparer( const QgsPointXY &origin )
272  : mOrigin( origin )
273  {}
274 
282  bool operator()( QgsLineSegment2D ab, QgsLineSegment2D cd ) const;
283 
284  private:
285 
286  QgsPointXY mOrigin;
287 
288 };
289 
290 
291 // adapted for QGIS geometry classes from original work at https://github.com/trylock/visibility by trylock
292 
298 class CORE_EXPORT QgsClockwiseAngleComparer
299 {
300  public:
301  explicit QgsClockwiseAngleComparer( const QgsPointXY &origin )
302  : mVertex( origin )
303  {}
304 
305  bool operator()( const QgsPointXY &a, const QgsPointXY &b ) const;
306 
307  private:
308 
309  QgsPointXY mVertex;
310 
311 };
312 
314 
315 #endif // QGSINTERNALGEOMETRYENGINE_H
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a tapered width buffer for a (multi)curve geometry.
int precision
QgsInternalGeometryEngine(const QgsGeometry &geometry)
The caller is responsible that the geometry is available and unchanged for the whole lifetime of this...
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer using the m-values from a (multi)line geometry.
QgsGeometry variableWidthBuffer(int segments, const std::function< std::unique_ptr< double[] >(const QgsLineString *line) > &widthFunction) const
Calculates a variable width buffer for a (multi)curve geometry.
QgsGeometry poleOfInaccessibility(double precision, double *distanceFromBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
static QVector< QgsPointXY > randomPointsInPolygon(const QgsGeometry &polygon, int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0)
Returns a list of count random points generated inside a polygon geometry (if acceptPoint is specifie...
A class to represent a 2D point.
Definition: qgspointxy.h:43
QString lastError() const
Returns an error string referring to the last error encountered.
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:123
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Definition: MathUtils.cpp:786
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:43
A 2D ray which extends from an origin point to an infinite distance in a given direction.
QgsGeometry orientedMinimumBoundingBox(double &area, double &angle, double &width, double &height) const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
Definition: qgsgeos.h:79
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
Abstract base class for all geometries.
QgsGeometry convertToCurves(double distanceTolerance, double angleTolerance) const
Attempts to convert a non-curved geometry into a curved geometry type (e.g.
This class offers geometry processing methods.
Represents a single 2D line segment, consisting of a 2D start and end vertex only.
A class to represent a vector.
Definition: qgsvector.h:29
QgsRay2D(const QgsPointXY &origin, QgsVector direction)
Constructor for a ray starting at the given origin and extending an infinite distance in the specifie...
#define SIP_OUT
Definition: qgis_sip.h:58
Line string geometry type, with support for z-dimension and m-values.
Definition: qgslinestring.h:43
QgsGeometry orthogonalize(double tolerance=1.0E-8, int maxIterations=1000, double angleThreshold=15.0) const
Attempts to orthogonalize a line or polygon geometry by shifting vertices to make the geometries angl...
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Densifies the geometry by adding the specified number of extra nodes within each segment of the geome...
QgsGeometry extrude(double x, double y) const
Will extrude a line or (segmentized) curve by a given offset and return a polygon representation of i...