28 bool anyWet =
false, allWet =
true;
29 for (
int i = 0; i < n; ++i) {
30 anyWet = anyWet || s[i] > 0.0;
31 allWet = allWet && s[i] > 0.0;
38 double cu[16], cv[16];
40 for (
int i = 0; i < n; ++i) {
41 const int j = (i + 1) % n;
46 if ((s[i] > 0.0) != (s[j] > 0.0)) {
47 const double t = s[i] / (s[i] - s[j]);
48 cu[m] = u[i] + t * (u[j] - u[i]);
49 cv[m++] = v[i] + t * (v[j] - v[i]);
52 double wetArea = 0.0, area = 0.0;
53 for (
int i = 0; i < m; ++i)
54 wetArea += cu[i] * cv[(i + 1) % m] - cu[(i + 1) % m] * cv[i];
55 for (
int i = 0; i < n; ++i)
56 area += u[i] * v[(i + 1) % n] - u[(i + 1) % n] * v[i];
57 return std::clamp(wetArea / area, 0.0, 1.0);
70double DoorWetFraction(Environment& environment,
double time,
const double origin[3],
const double cornerBody[4][3],
71 const double cornerNed[4][3],
double waveBound)
73 double top = std::numeric_limits<double>::infinity();
74 for (
int i = 0; i < 4; ++i)
75 top = std::min(top, cornerNed[i][2]);
78 double elevation = 0.0;
79 environment.GetSurfaceElevation(time, origin, elevation);
80 double u[4], v[4], s[4];
81 for (
int i = 0; i < 4; ++i) {
82 u[i] = cornerBody[i][0];
83 v[i] = cornerBody[i][2];
84 s[i] = cornerNed[i][2] + elevation;