42 bool anyWet =
false, allWet =
true;
43 for (
int i = 0; i < n; ++i) {
44 anyWet = anyWet || s[i] > 0.0;
45 allWet = allWet && s[i] > 0.0;
52 double cu[16], cv[16];
54 for (
int i = 0; i < n; ++i) {
55 const int j = (i + 1) % n;
60 if ((s[i] > 0.0) != (s[j] > 0.0)) {
61 const double t = s[i] / (s[i] - s[j]);
62 cu[m] = u[i] + t * (u[j] - u[i]);
63 cv[m++] = v[i] + t * (v[j] - v[i]);
66 double wetArea = 0.0, area = 0.0;
67 for (
int i = 0; i < m; ++i)
68 wetArea += cu[i] * cv[(i + 1) % m] - cu[(i + 1) % m] * cv[i];
69 for (
int i = 0; i < n; ++i)
70 area += u[i] * v[(i + 1) % n] - u[(i + 1) % n] * v[i];
71 return std::clamp(wetArea / area, 0.0, 1.0);
84double DoorWetFraction(Environment& environment,
double time,
const double origin[3],
const double cornerBody[4][3],
85 const double cornerNed[4][3],
double waveBound)
87 double top = std::numeric_limits<double>::infinity();
88 for (
int i = 0; i < 4; ++i)
89 top = std::min(top, cornerNed[i][2]);
92 double elevation = 0.0;
93 environment.GetSurfaceElevation(time, origin, elevation);
94 double u[4], v[4], s[4];
95 for (
int i = 0; i < 4; ++i) {
96 u[i] = cornerBody[i][0];
97 v[i] = cornerBody[i][2];
98 s[i] = cornerNed[i][2] + elevation;