145 const auto id =
GetId();
146 const auto nPanels = panels.size();
150 std::cerr <<
"SolidTube::SolidPanels:\n"
151 <<
" Zero norm direction vector; no panels generated.\n";
155 const unsigned int nPoints = 4 * (m_n - 1);
162 double alpha = m_rot;
163 double calpha = cos(alpha);
164 double salpha = sin(alpha);
165 double xv0, yv0, zv0;
166 ToGlobal(m_rpI * calpha, m_rpI * salpha, +m_lZ, xv0, yv0, zv0);
167 double xv1, yv1, zv1;
168 ToGlobal(m_rpO * calpha, m_rpO * salpha, +m_lZ, xv1, yv1, zv1);
170 for (
unsigned int i = 0; i < nPoints; ++i) {
171 alpha += HalfPi / (m_n - 1.);
174 double xv2, yv2, zv2;
175 ToGlobal(m_rpO * calpha, m_rpO * salpha, +m_lZ, xv2, yv2, zv2);
176 double xv3, yv3, zv3;
177 ToGlobal(m_rpI * calpha, m_rpI * salpha, +m_lZ, xv3, yv3, zv3);
178 std::vector<double> xv = {xv0, xv1, xv2, xv3};
179 std::vector<double> yv = {yv0, yv1, yv2, yv3};
180 std::vector<double> zv = {zv0, zv1, zv2, zv3};
190 panels.push_back(std::move(panel));
200 std::vector<double> xv;
201 std::vector<double> yv;
202 std::vector<double> zv;
203 const double r = m_rpO;
204 for (
unsigned int i = 1; i <= nPoints; i++) {
205 const double alpha = m_rot + HalfPi * (i - 1.) / (m_n - 1.);
208 ToGlobal(r * cos(alpha), r * sin(alpha), m_lZ, x, y, z);
222 panels.push_back(std::move(panel));
231 double alpha = m_rot;
232 double calpha = cos(alpha);
233 double salpha = sin(alpha);
234 double xv0, yv0, zv0;
235 ToGlobal(m_rpI * calpha, m_rpI * salpha, -m_lZ, xv0, yv0, zv0);
236 double xv1, yv1, zv1;
237 ToGlobal(m_rpO * calpha, m_rpO * salpha, -m_lZ, xv1, yv1, zv1);
239 for (
unsigned int i = 0; i < nPoints; ++i) {
240 alpha += HalfPi / (m_n - 1.);
243 double xv2, yv2, zv2;
244 ToGlobal(m_rpO * calpha, m_rpO * salpha, -m_lZ, xv2, yv2, zv2);
245 double xv3, yv3, zv3;
246 ToGlobal(m_rpI * calpha, m_rpI * salpha, -m_lZ, xv3, yv3, zv3);
247 std::vector<double> xv = {xv0, xv1, xv2, xv3};
248 std::vector<double> yv = {yv0, yv1, yv2, yv3};
249 std::vector<double> zv = {zv0, zv1, zv2, zv3};
259 panels.push_back(std::move(panel));
269 std::vector<double> xv;
270 std::vector<double> yv;
271 std::vector<double> zv;
272 const double r = m_rpO;
273 for (
unsigned int i = 1; i <= nPoints; i++) {
274 const double alpha = m_rot + HalfPi * (i - 1.) / (m_n - 1.);
277 ToGlobal(r * cos(alpha), r * sin(alpha), -m_lZ, x, y, z);
291 panels.push_back(std::move(panel));
295 const unsigned int n = m_rpI > 0. ? 2 : 1;
296 for (
unsigned int j = 0; j < n; ++j) {
297 const double r = j == 0 ? m_rpO : m_rpI;
298 double u = r * cos(m_rot);
299 double v = r * sin(m_rot);
301 double xv0, yv0, zv0;
302 ToGlobal(u, v, -m_lZ, xv0, yv0, zv0);
303 double xv1, yv1, zv1;
304 ToGlobal(u, v, +m_lZ, xv1, yv1, zv1);
306 for (
unsigned int i = 2; i <= nPoints + 1; i++) {
308 double alpha = m_rot + HalfPi * (i - 1.) / (m_n - 1.);
312 double xv2, yv2, zv2;
313 ToGlobal(u, v, +m_lZ, xv2, yv2, zv2);
314 double xv3, yv3, zv3;
315 ToGlobal(u, v, -m_lZ, xv3, yv3, zv3);
318 alpha = m_rot + HalfPi * (i - 1.5) / (m_n - 1.);
319 const double cAlpha = cos(alpha);
320 const double sAlpha = sin(alpha);
329 panel.
xv = {xv0, xv1, xv2, xv3};
330 panel.
yv = {yv0, yv1, yv2, yv3};
331 panel.
zv = {zv0, zv1, zv2, zv3};
334 panels.push_back(std::move(panel));
344 std::cout <<
"SolidTube::SolidPanels: " << panels.size() - nPanels
364 const double xn,
const double yn,
const double zn,
365 std::vector<Panel>& panels) {
370 std::vector<double> xv;
371 std::vector<double> yv;
372 std::vector<double> zv;
374 const unsigned int nPoints = 4 * (m_n - 1);
375 const double dphi = HalfPi / (m_n - 1.);
377 for (
const auto zLid : {-m_lZ, +m_lZ}) {
379 ToGlobal(r * cos(m_rot), r * sin(m_rot), zLid, x1, y1, z1);
381 for (
unsigned int i = 2; i <= nPoints + 1; ++i) {
382 const double phi = m_rot + (i - 1.) * dphi;
384 ToGlobal(r * cos(phi), r * sin(phi), zLid, x2, y2, z2);
387 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0,
388 xn, yn, zn, xc, yc, zc)) {
400 for (
unsigned int i = 2; i <= nPoints + 1; ++i) {
402 const double phi = m_rot + (i - 1.) * dphi;
403 const double u = r * cos(phi);
404 const double v = r * sin(phi);
411 if (
Intersect(x1, y1, z1, x2, y2, z2, x0, y0, z0, xn, yn, zn, xc, yc, zc)) {
420 if (xv.size() >= 3) {
430 panels.push_back(std::move(panel));
static bool Intersect(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, const double x0, const double y0, const double z0, const double a, const double b, const double c, double &xc, double &yc, double &zc)