91 const auto id =
GetId();
92 const unsigned int nPanels = panels.size();
96 std::cerr <<
"SolidRidge::SolidPanels:\n"
97 <<
" Zero norm direction vector; no panels generated.\n";
100 double xv0, yv0, zv0;
101 double xv1, yv1, zv1;
102 double xv2, yv2, zv2;
103 double xv3, yv3, zv3;
106 ToGlobal(-m_lX, -m_lY, 0, xv0, yv0, zv0);
107 ToGlobal(-m_lX, +m_lY, 0, xv1, yv1, zv1);
108 ToGlobal(+m_lX, +m_lY, 0, xv2, yv2, zv2);
109 ToGlobal(+m_lX, -m_lY, 0, xv3, yv3, zv3);
115 base.
xv = {xv0, xv1, xv2, xv3};
116 base.
yv = {yv0, yv1, yv2, yv3};
117 base.
zv = {zv0, zv1, zv2, zv3};
120 panels.push_back(std::move(base));
123 for (
unsigned int i = 0; i < 2; ++i) {
124 const double y = i == 0 ? -m_lY : +m_lY;
125 ToGlobal(-m_lX, y, 0, xv0, yv0, zv0);
126 ToGlobal(+m_lX, y, 0, xv1, yv1, zv1);
127 ToGlobal(m_hx, y, m_hz, xv2, yv2, zv2);
135 side.
xv = {xv0, xv1, xv2};
136 side.
yv = {yv0, yv1, yv2};
137 side.
zv = {zv0, zv1, zv2};
140 panels.push_back(std::move(side));
144 for (
unsigned int i = 0; i < 2; ++i) {
145 const double x = i == 0 ? +m_lX : -m_lX;
146 ToGlobal(x, -m_lY, 0, xv0, yv0, zv0);
147 ToGlobal(x, +m_lY, 0, xv1, yv1, zv1);
148 ToGlobal(m_hx, +m_lY, m_hz, xv2, yv2, zv2);
149 ToGlobal(m_hx, -m_lY, m_hz, xv3, yv3, zv3);
150 const double dx = i == 0 ? m_lX - m_hx : m_lX + m_hx;
151 const double s = sqrt(m_hz * m_hz + dx * dx);
152 const double xroof = i == 0 ? m_hz / s : -m_hz / s;
153 const double zroof = dx / s;
159 roof.
xv = {xv0, xv1, xv2, xv3};
160 roof.
yv = {yv0, yv1, yv2, yv3};
161 roof.
zv = {zv0, zv1, zv2, zv3};
164 panels.push_back(std::move(roof));
166 std::cout <<
"SolidRidge::SolidPanels: " << panels.size() - nPanels
196 const double xn,
const double yn,
const double zn,
197 std::vector<Panel>& panels) {
203 std::vector<double> xv;
204 std::vector<double> yv;
205 std::vector<double> zv;
209 ToGlobal(-m_lX, -m_lY, 0., x1, y1, z1);
211 ToGlobal(+m_lX, -m_lY, 0., x2, y2, z2);
213 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
219 ToGlobal(-m_lX, +m_lY, 0., x2, y2, z2);
220 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
226 ToGlobal(m_hx, -m_lY, m_hz, x2, y2, z2);
227 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
234 ToGlobal(+m_lX, +m_lY, 0., x1, y1, z1);
235 ToGlobal(-m_lX, +m_lY, 0., x2, y2, z2);
236 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
243 ToGlobal(+m_lX, -m_lY, 0., x2, y2, z2);
244 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
251 ToGlobal(m_hx, +m_lY, m_hz, x2, y2, z2);
252 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
259 ToGlobal(-m_lX, +m_lY, 0., x1, y1, z1);
260 ToGlobal(m_hx, +m_lY, m_hz, x2, y2, z2);
261 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
268 ToGlobal(m_hx, +m_lY, m_hz, x1, y1, z1);
269 ToGlobal(m_hx, -m_lY, m_hz, x2, y2, z2);
270 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
277 ToGlobal(m_hx, -m_lY, m_hz, x1, y1, z1);
278 ToGlobal(+m_lX, -m_lY, 0., x2, y2, z2);
279 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
287 if (xv.size() >= 3) {
297 panels.push_back(std::move(panel));