SWMMVis  6.0.0-alpha.4
Qt6/C++ GIS-based graphical user interface for the SWMMVis engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
editgeometry.h
Go to the documentation of this file.
1
12#ifndef EDITGEOMETRY_H
13#define EDITGEOMETRY_H
14
15#include <QPointF>
16#include <QVector>
17
18namespace EditGeometry
19{
20
28constexpr double kCoincidenceTol = 1e-6;
29
42[[nodiscard]] QVector<QPointF> cleanPolyline(const QVector<QPointF> &v,
43 double tol = kCoincidenceTol);
44
57[[nodiscard]] QVector<QPointF> cleanPolygonRing(const QVector<QPointF> &v,
58 double tol = kCoincidenceTol);
59
77[[nodiscard]] QVector<QPointF> orientInteriorToEndpoints(
78 QVector<QPointF> interior, const QPointF &from, const QPointF &to);
79
88[[nodiscard]] double polylineLength(const QVector<QPointF> &vertices);
89
98[[nodiscard]] QVector<QPointF> replacedAt(const QVector<QPointF> &vertices,
99 int index,
100 const QPointF &newPt);
101
107[[nodiscard]] QVector<QPointF> insertedAt(const QVector<QPointF> &vertices,
108 int index,
109 const QPointF &newPt);
110
116[[nodiscard]] QVector<QPointF> removedAt(const QVector<QPointF> &vertices,
117 int index);
118
130[[nodiscard]] double distanceToPolyline(const QVector<QPointF> &vertices,
131 const QPointF &point,
132 int *segmentIndex = nullptr,
133 QPointF *closestPoint = nullptr);
134
142[[nodiscard]] double polygonArea(const QVector<QPointF> &polygon);
143
144// ===========================================================================
145// Multi-ring polygons (polygons with holes)
146// ===========================================================================
147//
148// A shared value type for a polygon that owns one exterior ring plus zero or
149// more interior rings (holes). Rings are stored OPEN (no repeated closing
150// vertex), matching cleanPolygonRing() and the SWMM [POLYGONS] convention.
151// This is the single geometry representation consumed by rendering, meshing,
152// editing, and I/O so there is no parallel hole encoding.
153
162{
163 QVector<QPointF> exterior;
164 QVector<QVector<QPointF>> interiors;
165
166 [[nodiscard]] bool isEmpty() const { return exterior.size() < 3; }
167 [[nodiscard]] int holeCount() const { return static_cast<int>(interiors.size()); }
168};
169
175[[nodiscard]] double signedRingArea(const QVector<QPointF> &ring);
176
181[[nodiscard]] bool pointInRing(const QVector<QPointF> &ring, const QPointF &pt);
182
187[[nodiscard]] RingPolygon normalizeRingPolygon(RingPolygon p,
188 double tol = kCoincidenceTol);
189
193[[nodiscard]] double netArea(const RingPolygon &p);
194
198[[nodiscard]] bool containsPoint(const RingPolygon &p, const QPointF &pt);
199
209[[nodiscard]] QPointF interiorPoint(const QVector<QPointF> &ring);
210
220
225[[nodiscard]] RingValidity validateRingPolygon(const RingPolygon &p);
226
227} // namespace EditGeometry
228
229#endif // EDITGEOMETRY_H
int e
Definition inpmeshreader.cpp:41
ArrowPlacement p
Definition linesymbollayer.cpp:27
int index
Position in m_quadRegions / m_quadReports.
Definition meshgenerator.cpp:153
QPolygonF ring
normalizeRingCCW(r.ring).
Definition meshgenerator.cpp:156
Definition editgeometry.h:19
bool containsPoint(const RingPolygon &p, const QPointF &pt)
True when pt is inside the exterior and outside every hole.
Definition editgeometry.cpp:330
double polygonArea(const QVector< QPointF > &polygon)
Compute the area of a polygon using the shoelace formula.
Definition editgeometry.cpp:177
QVector< QPointF > cleanPolyline(const QVector< QPointF > &v, double tol=kCoincidenceTol)
Drop consecutive coincident points from a polyline.
Definition editgeometry.cpp:27
RingValidity
Validity classes for a RingPolygon (in-house checks, no GEOS).
Definition editgeometry.h:213
@ HoleOutsideExterior
A hole escapes / crosses the exterior.
@ SelfIntersecting
Exterior or a hole crosses itself.
@ TooFewVertices
Exterior or a hole has < 3 vertices.
@ HolesOverlap
Two holes overlap or nest.
QVector< QPointF > replacedAt(const QVector< QPointF > &vertices, int index, const QPointF &newPt)
Replace one endpoint of a polyline, producing a new vector.
Definition editgeometry.cpp:89
RingPolygon normalizeRingPolygon(RingPolygon p, double tol=kCoincidenceTol)
Clean every ring (dedupe + de-close), drop degenerate interior rings, and orient exterior CCW / inter...
Definition editgeometry.cpp:303
RingValidity validateRingPolygon(const RingPolygon &p)
Validate a RingPolygon with in-house geometry checks (O(n^2) edge tests; intended for hand-digitized ...
Definition editgeometry.cpp:402
constexpr double kCoincidenceTol
Default coincidence tolerance, in layer-CRS units.
Definition editgeometry.h:28
double netArea(const RingPolygon &p)
Net area = |exterior| − Σ|holes|, clamped to >= 0.
Definition editgeometry.cpp:322
QVector< QPointF > orientInteriorToEndpoints(QVector< QPointF > interior, const QPointF &from, const QPointF &to)
Orient a link's interior bend points to run from from toward to.
Definition editgeometry.cpp:58
bool pointInRing(const QVector< QPointF > &ring, const QPointF &pt)
Even-odd point-in-ring test (boundary result is unspecified but stable). Returns false for rings with...
Definition editgeometry.cpp:281
double distanceToPolyline(const QVector< QPointF > &vertices, const QPointF &point, int *segmentIndex=nullptr, QPointF *closestPoint=nullptr)
Distance from a point to the nearest point on a polyline segment.
Definition editgeometry.cpp:124
double signedRingArea(const QVector< QPointF > &ring)
Signed area of a ring via the shoelace formula.
Definition editgeometry.cpp:266
QVector< QPointF > insertedAt(const QVector< QPointF > &vertices, int index, const QPointF &newPt)
Insert a vertex at index, producing a new polyline of size+1.
Definition editgeometry.cpp:99
QPointF interiorPoint(const QVector< QPointF > &ring)
A point guaranteed strictly interior to a simple ring — robust for non-convex rings — suitable as a T...
Definition editgeometry.cpp:340
QVector< QPointF > removedAt(const QVector< QPointF > &vertices, int index)
Remove the vertex at index, producing a new polyline of size-1.
Definition editgeometry.cpp:112
double polylineLength(const QVector< QPointF > &vertices)
Compute the total length of a polyline.
Definition editgeometry.cpp:74
QVector< QPointF > cleanPolygonRing(const QVector< QPointF > &v, double tol=kCoincidenceTol)
Normalize a polygon ring: collapse coincident points and drop a redundant explicit closing vertex.
Definition editgeometry.cpp:45
QVector< int > v
pool vertex indices
Definition pslgminsize.cpp:159
A polygon: exactly one exterior ring + zero-or-more interior rings.
Definition editgeometry.h:162
int holeCount() const
Definition editgeometry.h:167
bool isEmpty() const
Definition editgeometry.h:166
QVector< QPointF > exterior
Outer boundary (open ring, >= 3 pts).
Definition editgeometry.h:163
QVector< QVector< QPointF > > interiors
Holes; each an open ring (>= 3 pts).
Definition editgeometry.h:164