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
meshpatch.h File Reference
#include "mesh/meshresult.h"
#include <QPair>
#include <QPointF>
#include <QPolygonF>
#include <QString>
#include <QVector>
Include dependency graph for meshpatch.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  mesh::StructuredPatch
 Four-sided patch: corners in cyclic order (either orientation); n subdivisions along corner0→corner1 (and corner3→corner2), m along corner0→corner3 (and corner1→corner2). More...
 
struct  mesh::SweptPatch
 Swept patch: the centreline is offset ±width/2 (mitred at interior vertices) and cut into across quads per station. along > 0 resamples every centreline segment to that target spacing (original vertices are kept); 0 = one station per centreline vertex. More...
 
struct  mesh::PatchMesh
 A generated patch in local indices. Quads are emitted CCW. More...
 

Namespaces

namespace  mesh
 

Functions

QString mesh::validate (const StructuredPatch &p)
 Input checks. Empty string = valid.
 
QString mesh::validate (const SweptPatch &p)
 
QString mesh::validate (const PatchMesh &pm)
 Rejects a patch with a folded / concave / degenerate quad (mesh::cellIsConvex). Empty string = valid.
 
PatchMesh mesh::makeTransfinitePatch (const StructuredPatch &p, QString *err=nullptr)
 Transfinite interpolation on the four straight sides. The result has (n+1)×(m+1) vertices and n×m quads. On invalid input returns an empty PatchMesh and sets *err.
 
PatchMesh mesh::makeSweptPatch (const SweptPatch &p, QString *err=nullptr)
 Sweep the centreline: (stations)×(across+1) vertices, (stations-1)×across quads. On invalid input (or a folded offset) returns an empty PatchMesh and sets *err.
 
PatchMesh mesh::makeTransfinitePatch (const QVector< QVector< QPointF > > &sides, int n, int m, const QString &tag, QString *err=nullptr)
 Transfinite (Coons) interpolation on four POLYLINE sides forming a loop: sides[0] runs c0→c1, sides[1] c1→c2, sides[2] c2→c3, sides[3] c3→c0 (each side's last point equals the next side's first). Sides are arc-length parametrised; n subdivisions along sides 0/2, m along 1/3. Boundary vertices are placed ON the polylines (so the ring the caller emits as PSLG segments is exactly this patch's boundary loop). Returns an empty PatchMesh + *err on invalid input (side with < 2 points, endpoints not matching, n or m < 1, folded quad).
 
PatchMesh mesh::makeMappedPatch (const QPolygonF &ring, const QVector< int > &corners, double h, const QString &tag, QString *err=nullptr)
 Split a CCW ring at the four corners (ring vertex indices, ring order) into polyline sides, choose n = max(1, round(mean(len0, len2)/h)), m likewise from sides 1/3, and call the polyline overload.
 

Detailed Description

Author
Caleb Buahin caleb.nosp@m..bua.nosp@m.hin@g.nosp@m.mail.nosp@m..com
Date
2026
License\n GPL-3.0-or-later

Structured quad patches (workplans/TRI_QUAD_MESHING_PLAN_2026-09-06.md §3.2, phase G3). Two authoring forms:

  • StructuredPatch — a four-sided polygon meshed by transfinite (Coons) interpolation between opposite sides, n × m quads;
  • SweptPatch — a centreline polyline swept with a width, quads laid across the channel at each station (channel / street case).

Both produce a PatchMesh in LOCAL vertex indices, which MeshGenerator::addPatch stitches into the triangle domain: the boundary segments become PSLG constraints, the interior a hole, and the quads are appended after the triangles (engine order).