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
terrainpolicy.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2#pragma once
3#include <algorithm>
4#include <cmath>
5#include <limits>
6
7namespace meshkit
8{
11
12// Immutable physical policy. Reference size and h share an XY unit; tolerances share a Z unit. h is the smallest prescribed
13// target over the entire affected footprint. Zero h means unbounded size.
14// Missing/invalid values return NaN, never an implicit relaxed tolerance.
17 double referenceSize = 10;
18 double minimumTolerance = 0;
19 double maximumTolerance = 0; // Zero inherits the resolved reference tolerance.
20
21 bool valid() const
22 {
25 std::isfinite(referenceSize) && referenceSize > 0 &&
26 std::isfinite(minimumTolerance) && minimumTolerance >= 0 &&
27 std::isfinite(maximumTolerance) && maximumTolerance >= 0 &&
29 }
30 double tolerance(double referenceTolerance, double h) const
31 {
32 const double unknown = std::numeric_limits<double>::quiet_NaN();
33 if (!valid() || !(referenceTolerance > 0) || !std::isfinite(referenceTolerance) ||
34 !std::isfinite(h) || h < 0)
35 return unknown;
37 return referenceTolerance;
38 const double cap = maximumTolerance > 0 ? maximumTolerance : referenceTolerance;
39 if (minimumTolerance > cap)
40 return unknown;
41 if (h == 0)
42 return cap;
43 const long double scaled = static_cast<long double>(referenceTolerance) * h / referenceSize;
44 return double(std::clamp(scaled, static_cast<long double>(minimumTolerance),
45 static_cast<long double>(cap)));
46 }
47};
48
49// Ordering heuristic only: maximum normal departure weighted by sampling scale
50// relative to the immutable target. All removal gates remain separate.
51inline double resolutionRemovalImportance(double flatness, double actualSize, double targetSize)
52{
53 if (!std::isfinite(flatness) || !(actualSize > 0) || !std::isfinite(actualSize) ||
54 !(targetSize > 0) || !std::isfinite(targetSize))
55 return std::numeric_limits<double>::infinity();
56 return std::sqrt(std::max(0., 2 * (1 - std::clamp(flatness, -1., 1.)))) *
57 (actualSize / targetSize);
58}
59}
int h
Definition mesh2dresultsexport.cpp:477
Definition qtcdtstorage.h:9
double resolutionRemovalImportance(double flatness, double actualSize, double targetSize)
Definition terrainpolicy.hpp:51
CoarseningOrder
Definition terrainpolicy.hpp:9
TerrainToleranceMode
Definition terrainpolicy.hpp:10
Definition terrainpolicy.hpp:15
bool valid() const
Definition terrainpolicy.hpp:21
double tolerance(double referenceTolerance, double h) const
Definition terrainpolicy.hpp:30
double minimumTolerance
Definition terrainpolicy.hpp:18
TerrainToleranceMode mode
Definition terrainpolicy.hpp:16
double referenceSize
Definition terrainpolicy.hpp:17
double maximumTolerance
Definition terrainpolicy.hpp:19
double
Definition swmmpollutantpropertyadapter.cpp:68