75 const QPointF &
a,
const QPointF &
b,
const QPointF &c,
76 double z0,
double z1,
double z2,
77 double sd0,
double sd1,
double sd2,
78 bool *degenerate =
nullptr)
80 if (degenerate) *degenerate =
false;
82 const double v0x = c.x() -
a.x(), v0y = c.y() -
a.y();
83 const double v1x =
b.x() -
a.x(), v1y =
b.y() -
a.y();
84 const double v2x =
p.x() -
a.x(), v2y =
p.y() -
a.y();
85 const double d00 = v0x * v0x + v0y * v0y;
86 const double d01 = v0x * v1x + v0y * v1y;
87 const double d11 = v1x * v1x + v1y * v1y;
88 const double d20 = v2x * v0x + v2y * v0y;
89 const double d21 = v2x * v1x + v2y * v1y;
90 const double denom = d00 * d11 - d01 * d01;
92 if (degenerate) *degenerate =
true;
95 const double u = (d11 * d20 - d01 * d21) / denom;
96 const double v = (d00 * d21 - d01 * d20) / denom;
97 const double w = 1.0 - u -
v;
108 const bool wet[3] = { sd0 > 0.0, sd1 > 0.0, sd2 > 0.0 };
109 const int nWet = int(wet[0]) + int(wet[1]) + int(wet[2]);
111 if (nWet == 0)
return 0.0;
113 const double eta[3] = { z0 + sd0, z1 + sd1, z2 + sd2 };
114 const double groundInterp =
w * z0 +
v * z1 + u * z2;
120 for (
int k = 0;
k < 3; ++
k) {
121 if (!wet[
k])
continue;
122 if (!any || eta[
k] > maxEta) { maxEta = eta[
k]; any =
true; }
130 blend =
w * sd0 +
v * sd1 + u * sd2;
139 double wetW = 0.0, wetE = 0.0;
140 const double wgt[3] = {
w,
v, u };
141 for (
int k = 0;
k < 3; ++
k) {
142 if (!wet[
k])
continue;
144 wetE += wgt[
k] * eta[
k];
149 const double etaS = (wetW > 1
e-12) ? wetE / wetW : maxEta;
150 blend = etaS - groundInterp;
153 const double capDepth = maxEta - groundInterp;
154 return std::max(0.0, std::min(blend, capDepth));