10 const double lx,
const double ly,
const double hz,
12 :
Solid(cx, cy, cz,
"SolidRidge"),
19 const double lx,
const double ly,
const double hz,
21 const double dx,
const double dy,
const double dz)
28 double u = x, v = y, w = z;
32 if (fabs(u) > m_lX || fabs(v) > m_lY || w < 0. || w > m_hz) {
34 }
else if (u >= m_hx && m_hz * u + (m_lX - m_hx) * v > m_hz * m_lX) {
36 }
else if (u <= m_hx && -m_hz * u + (m_lX + m_hx) * v > m_hz * m_lX) {
40 std::cout <<
"SolidRidge::IsInside: (" << x <<
", " << y <<
", " << z;
42 std::cout <<
") is inside.\n";
44 std::cout <<
") is outside.\n";
51 double& xmax,
double& ymax,
double& zmax)
const {
62 const double dd = sqrt(m_lX * m_lX + m_lY * m_lY + m_hz * m_hz);
74 std::cerr <<
"SolidRidge::SetHalfLengthX: Half-length must be > 0.\n";
82 std::cerr <<
"SolidRidge::SetHalfLengthY: Half-length must be > 0.\n";
90 std::cerr <<
"SolidRidge::SetRidgeHeight: Height must be > 0.\n";
97 const auto id =
GetId();
98 const unsigned int nPanels = panels.size();
102 std::cerr <<
"SolidRidge::SolidPanels:\n"
103 <<
" Zero norm direction vector; no panels generated.\n";
106 double xv0, yv0, zv0;
107 double xv1, yv1, zv1;
108 double xv2, yv2, zv2;
109 double xv3, yv3, zv3;
112 ToGlobal(-m_lX, -m_lY, 0, xv0, yv0, zv0);
113 ToGlobal(-m_lX, +m_lY, 0, xv1, yv1, zv1);
114 ToGlobal(+m_lX, +m_lY, 0, xv2, yv2, zv2);
115 ToGlobal(+m_lX, -m_lY, 0, xv3, yv3, zv3);
121 base.
xv = {xv0, xv1, xv2, xv3};
122 base.
yv = {yv0, yv1, yv2, yv3};
123 base.
zv = {zv0, zv1, zv2, zv3};
126 panels.push_back(std::move(base));
129 for (
unsigned int i = 0; i < 2; ++i) {
130 const double y = i == 0 ? -m_lY : +m_lY;
131 ToGlobal(-m_lX, y, 0, xv0, yv0, zv0);
132 ToGlobal(+m_lX, y, 0, xv1, yv1, zv1);
133 ToGlobal(m_hx, y, m_hz, xv2, yv2, zv2);
141 side.
xv = {xv0, xv1, xv2};
142 side.
yv = {yv0, yv1, yv2};
143 side.
zv = {zv0, zv1, zv2};
146 panels.push_back(std::move(side));
150 for (
unsigned int i = 0; i < 2; ++i) {
151 const double x = i == 0 ? +m_lX : -m_lX;
152 ToGlobal(x, -m_lY, 0, xv0, yv0, zv0);
153 ToGlobal(x, +m_lY, 0, xv1, yv1, zv1);
154 ToGlobal(m_hx, +m_lY, m_hz, xv2, yv2, zv2);
155 ToGlobal(m_hx, -m_lY, m_hz, xv3, yv3, zv3);
156 const double dx = i == 0 ? m_lX - m_hx : m_lX + m_hx;
157 const double s = sqrt(m_hz * m_hz + dx * dx);
158 const double xroof = i == 0 ? m_hz / s : -m_hz / s;
159 const double zroof = dx / s;
165 roof.
xv = {xv0, xv1, xv2, xv3};
166 roof.
yv = {yv0, yv1, yv2, yv3};
167 roof.
zv = {zv0, zv1, zv2, zv3};
170 panels.push_back(std::move(roof));
172 std::cout <<
"SolidRidge::SolidPanels: " << panels.size() - nPanels
180 double u = 0., v = 0., w = 0.;
183 if (v > std::max(std::abs(u), std::abs(w))) {
185 }
else if (v < -std::max(std::abs(u), std::abs(w))) {
187 }
else if (w < -std::max(std::abs(u), std::abs(v))) {
195 std::cout <<
m_className <<
"::GetDiscretisationLevel:\n"
196 <<
" Found no match for the panel; return first value.\n";
Triangular prism (Toblerone bar).
SolidRidge(const double cx, const double cy, const double cz, const double lx, const double ly, const double hz, const double offsetx)
Constructor from centre, half-lengths, height and x-offset.
bool GetBoundingBox(double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) const override
Return the bounding box of the solid.
void SetRidgeHeight(const double hz)
Set the height of the ridge.
double GetDiscretisationLevel(const Panel &panel) override
Retrieve the discretization level of a panel.
void SetHalfLengthX(const double lx)
Set the half-length along x.
bool SolidPanels(std::vector< Panel > &panels) override
Retrieve the surface panels of the solid.
bool IsInside(const double x, const double y, const double z) const override
Check whether a given point is inside the solid.
void SetHalfLengthY(const double ly)
Set the half-length along y.
Abstract base class for solids.
void VectorToLocal(const double x, const double y, const double z, double &u, double &v, double &w)
Transform a vector from global to local coordinates.
double m_cTheta
Polar angle.
double m_dX
Direction vector.
unsigned int GetId() const
Get the ID of the solid.
void ToLocal(const double x, const double y, const double z, double &u, double &v, double &w) const
void SetDirection(const double dx, const double dy, const double dz)
void ToGlobal(const double u, const double v, const double w, double &x, double &y, double &z) const
double m_cX
Centre of the solid.
double m_cPhi
Azimuthal angle.
std::string m_className
Class name.
std::vector< double > zv
Z-coordinates of vertices.
int volume
Reference to solid to which the panel belongs.
double a
Perpendicular vector.
double colour
Colour index.
std::vector< double > xv
X-coordinates of vertices.
std::vector< double > yv
Y-coordinates of vertices.