23#ifndef VCL_ALGORITHMS_MESH_CREATE_CONE_H
24#define VCL_ALGORITHMS_MESH_CREATE_CONE_H
26#include <vclib/math/base.h>
27#include <vclib/mesh/requirements.h>
31template<FaceMeshConcept MeshType>
36 const uint subdivisions = 36)
38 using CoordType = MeshType::VertexType::CoordType;
39 using ScalarType = CoordType::ScalarType;
42 if (radiusBottom == 0 || radiusTop == 0) {
43 vn = subdivisions + 2;
44 fn = subdivisions * 2;
47 vn = subdivisions * 2 + 2;
48 fn = subdivisions * 4;
53 mesh.reserveVertices(vn);
54 mesh.reserveFaces(fn);
56 mesh.addVertex(CoordType(0, -height / 2.0, 0));
57 mesh.addVertex(CoordType(0, height / 2.0, 0));
62 if (radiusBottom != 0) {
63 for (uint i = 0; i < subdivisions; ++i) {
64 ScalarType a =
toRad(i * 360.0 / subdivisions);
65 mesh.addVertex(CoordType(
66 radiusBottom * std::cos(a),
68 radiusBottom * std::sin(a)));
75 for (uint i = 0; i < subdivisions; ++i) {
76 ScalarType a =
toRad(i * 360.0 / subdivisions);
77 mesh.addVertex(CoordType(
78 radiusTop * std::cos(a),
80 radiusTop * std::sin(a)));
84 if (radiusBottom != 0) {
85 for (uint i = 0; i < subdivisions; ++i) {
86 mesh.addFace(0, b1 + i, b1 + (i + 1) % subdivisions);
90 for (uint i = 0; i < subdivisions; ++i) {
91 mesh.addFace(0, b2 + i, b2 + (i + 1) % subdivisions);
96 for (uint i = 0; i < subdivisions; ++i) {
97 mesh.addFace(1, b2 + (i + 1) % subdivisions, b2 + i);
101 for (uint i = 0; i < subdivisions; ++i) {
102 mesh.addFace(1, b1 + (i + 1) % subdivisions, b1 + i);
107 if (radiusBottom != 0 && radiusTop != 0) {
108 for (uint i = 0; i < subdivisions; ++i) {
109 mesh.addFace(b1 + i, b2 + i, b2 + (i + 1) % subdivisions);
112 b2 + (i + 1) % subdivisions,
113 b1 + (i + 1) % subdivisions);
120template<FaceMeshConcept MeshType>
121MeshType createCylinder(
auto radius,
auto height,
const uint subdivisions = 36)
123 return createCone<MeshType>(radius, radius, height, subdivisions);
Scalar toRad(const Scalar °)
Converts an angle in degrees to radians.
Definition base.h:83