FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
DoorSubmergence.h
1#pragma once
2
3#include <algorithm>
4#include <limits>
5
16{
17
26inline double PolygonSubmergedFraction(const double u[], const double v[], const double s[], int n)
27{
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;
32 }
33 if (allWet)
34 return 1.0;
35 if (!anyWet)
36 return 0.0;
37
38 double cu[16], cv[16];
39 int m = 0;
40 for (int i = 0; i < n; ++i) {
41 const int j = (i + 1) % n;
42 if (s[i] > 0.0) {
43 cu[m] = u[i];
44 cv[m++] = v[i];
45 }
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]);
50 }
51 }
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);
58}
59
69template<class Environment>
70double DoorWetFraction(Environment& environment, double time, const double origin[3], const double cornerBody[4][3],
71 const double cornerNed[4][3], double waveBound)
72{
73 double top = std::numeric_limits<double>::infinity();
74 for (int i = 0; i < 4; ++i)
75 top = std::min(top, cornerNed[i][2]);
76 if (top > waveBound)
77 return 1.0;
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;
85 }
86 return PolygonSubmergedFraction(u, v, s, 4);
87}
88
89} // namespace door_submergence
Definition DoorSubmergence.h:16
double PolygonSubmergedFraction(const double u[], const double v[], const double s[], int n)
Definition DoorSubmergence.h:26
double DoorWetFraction(Environment &environment, double time, const double origin[3], const double cornerBody[4][3], const double cornerNed[4][3], double waveBound)
Definition DoorSubmergence.h:70