23 int const sides = qRound(numSides);
24 bool const smooth = (0 == sides);
25 int const slices = smooth ?
SLICES : sides;
30 float Rb = R, Rt = Rb * ratio_Rt_Rb, H = 2 * R;
33 Vertices vb(slices), vt(slices), nbt(slices);
34 float const nz = (1 - Rt / Rb) * H;
36 for (
int s = 0; s < slices; ++s) {
37 float th = float(2 *
M_PI * s / slices), st = sinf(th), ct = cosf(th);
39 Vector3D vb_(Rb * ct, Rb * st, 0), vt_(Rt * ct, Rt * st, H);
47 int const nv = 6 * 2 * slices;
54 for (
int s = 0; s < slices; ++s) {
55 int s1 = s, s2 = (s + 1) % slices;
65 vs.
addQuad(vb.at(s1), vb.at(s2), vt.at(s2), vt.at(s1));
67 auto &n1 = nbt.at(s1), &n2 = nbt.at(s2);
73 ASSERT(!smooth || ns.count() == nv);
75 return makeMesh(vs, smooth ? &ns :
nullptr);
Defines the macro ASSERT.
#define ASSERT(condition)
static Mesh makeMesh(const Vertices &vs, Vertices const *ns=nullptr)
static Mesh meshColumn(float ratio_Rt_Rb, float numSides)
QVector< Vert_Normal > Mesh
void addVertex(const Vector3D &, int n=1)
void addTriangle(const Vector3D &, const Vector3D &, const Vector3D &)
void addQuad(const Vector3D &, const Vector3D &, const Vector3D &, const Vector3D &)
Vector3D normalized() const