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
pslgprep.h
Go to the documentation of this file.
1
21#ifndef OPENSWMMVIS_MESH_PSLGPREP_H
22#define OPENSWMMVIS_MESH_PSLGPREP_H
23
24#include "mesh/meshgenerator.h"
25
26#include <QPointF>
27#include <QPolygonF>
28#include <QRectF>
29#include <QVector>
30
31#include <functional>
32
33namespace mesh {
34namespace pslg {
35
38[[nodiscard]] QVector<QPointF> simplifyPolyline(const QVector<QPointF> &pts,
39 double epsilon);
40
43[[nodiscard]] QVector<QPointF> simplifyRing(const QVector<QPointF> &ring,
44 double epsilon);
45
48[[nodiscard]] QVector<QPointF> densifyRing(const QVector<QPointF> &ring,
49 double maxLen);
50
52[[nodiscard]] double polylineLength(const QVector<QPointF> &pts);
53
71[[nodiscard]] QVector<QPointF> resampleMinLength(const QVector<QPointF> &pts,
72 double minLen,
73 double maxDeviation,
74 int *flaggedOut = nullptr);
75
80[[nodiscard]] QVector<QPointF> resampleRingMinLength(const QVector<QPointF> &ring,
81 double minLen,
82 double maxDeviation,
83 int *flaggedOut = nullptr);
84
87[[nodiscard]] double ringSignedArea(const QVector<QPointF> &ring);
88
90[[nodiscard]] double distSqToSegment(const QPointF &p, const QPointF &a,
91 const QPointF &b);
92
96void snapAndDedupe(QVector<mesh::SteinerPoint> &pts, double snapEps);
97
107[[nodiscard]] QVector<bool> greedyMinSeparation(const QVector<QPointF> &pts,
108 double minSep);
109
118{
119 QVector<QPointF> ring;
120 QPointF seed;
121 bool valid = false;
122};
123
125[[nodiscard]] PreparedRing prepareHoleRing(const QVector<QPointF> &raw,
126 double simplifyEps,
127 double maxEdgeLen);
128
138bool prepareHoleRings(const QVector<QVector<QPointF>> &raw,
139 double simplifyEps, double maxEdgeLen,
140 QVector<PreparedRing> *out,
141 const std::function<bool()> &isCancelled = {},
142 const std::function<void(int, int)> &onChunk = {},
143 int *skippedOut = nullptr);
144
156{
157public:
158 void build(const QVector<QPolygonF> &domains,
159 const QVector<QVector<QPointF>> &holes = {},
160 int nBands = 1024);
161
162 [[nodiscard]] bool contains(const QPointF &p) const;
163 [[nodiscard]] QRectF boundingBox() const;
164 [[nodiscard]] bool isEmpty() const { return m_edges.isEmpty(); }
165
166private:
167 void addRing(const QVector<QPointF> &ring);
168
169 QVector<QPair<QPointF, QPointF>> m_edges;
170 QVector<QVector<int>> m_bandEdges;
171 double m_x0 = 0.0, m_x1 = 0.0, m_y0 = 0.0, m_y1 = 0.0;
172 double m_bandH = 0.0;
173 int m_nBands = 0;
174};
175
176} // namespace pslg
177} // namespace mesh
178
179#endif // OPENSWMMVIS_MESH_PSLGPREP_H
y-banded odd-even point-in-rings index.
Definition pslgprep.h:156
bool isEmpty() const
Definition pslgprep.h:164
void build(const QVector< QPolygonF > &domains, const QVector< QVector< QPointF > > &holes={}, int nBands=1024)
Definition pslgprep.cpp:495
bool contains(const QPointF &p) const
Definition pslgprep.cpp:527
QRectF boundingBox() const
Definition pslgprep.cpp:549
ArrowPlacement p
Definition linesymbollayer.cpp:27
QPolygonF ring
normalizeRingCCW(r.ring).
Definition meshgenerator.cpp:156
QVector< QPointF > pts
Definition meshpatch.cpp:62
int b
local residual indices, a < b
Definition meshquadmatch.cpp:46
int a
Definition meshquadmatch.cpp:46
QVector< QPointF > densifyRing(const QVector< QPointF > &ring, double maxLen)
Definition pslgprep.cpp:99
void snapAndDedupe(QVector< mesh::SteinerPoint > &pts, double snapEps)
Definition pslgprep.cpp:326
QVector< bool > greedyMinSeparation(const QVector< QPointF > &pts, double minSep)
Greedy minimum-separation thinning in input order.
Definition pslgprep.cpp:357
QVector< QPointF > simplifyPolyline(const QVector< QPointF > &pts, double epsilon)
Definition pslgprep.cpp:59
QVector< QPointF > simplifyRing(const QVector< QPointF > &ring, double epsilon)
Definition pslgprep.cpp:73
double distSqToSegment(const QPointF &p, const QPointF &a, const QPointF &b)
Definition pslgprep.cpp:309
QVector< QPointF > resampleMinLength(const QVector< QPointF > &pts, double minLen, double maxDeviation, int *flaggedOut=nullptr)
Length-based decimation — the inverse of densifyRing().
Definition pslgprep.cpp:173
double ringSignedArea(const QVector< QPointF > &ring)
Definition pslgprep.cpp:133
QVector< QPointF > resampleRingMinLength(const QVector< QPointF > &ring, double minLen, double maxDeviation, int *flaggedOut=nullptr)
Definition pslgprep.cpp:262
bool prepareHoleRings(const QVector< QVector< QPointF > > &raw, double simplifyEps, double maxEdgeLen, QVector< PreparedRing > *out, const std::function< bool()> &isCancelled={}, const std::function< void(int, int)> &onChunk={}, int *skippedOut=nullptr)
Prepare many hole rings in parallel (order-preserving).
Definition pslgprep.cpp:430
double polylineLength(const QVector< QPointF > &pts)
Definition pslgprep.cpp:125
PreparedRing prepareHoleRing(const QVector< QPointF > &raw, double simplifyEps, double maxEdgeLen)
Definition pslgprep.cpp:402
Definition meshcommands.h:302
One hole ring after preparation for the PSLG.
Definition pslgprep.h:118
QVector< QPointF > ring
simplified + densified boundary (mesh CRS)
Definition pslgprep.h:119
bool valid
false → degenerate or self-intersecting
Definition pslgprep.h:121
QPointF seed
interior seed point for Triangle's hole carve
Definition pslgprep.h:120