// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2018 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "cylinder_with_caps.h" #include "PI.h" #include #include template IGL_INLINE void igl::cylinder_with_caps( const int axis_devisions, const int height_devisions, Eigen::PlainObjectBase &V, Eigen::PlainObjectBase &F) { V.resize(axis_devisions * height_devisions, 3); F.resize(2 * (axis_devisions * height_devisions) - 4, 3); int f = 0; typedef typename DerivedV::Scalar Scalar; for (int th = 0; th < axis_devisions; th++) { Scalar x = cos(2. * igl::PI * Scalar(th) / Scalar(axis_devisions)); Scalar y = sin(2. * igl::PI * Scalar(th) / Scalar(axis_devisions)); for (int h = 0; h < height_devisions; h++) { Scalar z = Scalar(h) / Scalar(height_devisions - 1); V(th + h * axis_devisions, 0) = x; V(th + h * axis_devisions, 1) = y; V(th + h * axis_devisions, 2) = z; if (h > 0) { F(f, 0) = ((th + 0) % axis_devisions) + (h - 1) * axis_devisions; F(f, 1) = ((th + 1) % axis_devisions) + (h - 1) * axis_devisions; F(f, 2) = ((th + 0) % axis_devisions) + (h + 0) * axis_devisions; f++; F(f, 0) = ((th + 1) % axis_devisions) + (h - 1) * axis_devisions; F(f, 1) = ((th + 1) % axis_devisions) + (h + 0) * axis_devisions; F(f, 2) = ((th + 0) % axis_devisions) + (h + 0) * axis_devisions; f++; } } } for (int i = 0; i < axis_devisions - 2; ++i) { F(f, 2) = 0; F(f, 1) = ((i + 1) % axis_devisions); F(f, 0) = ((i + 2) % axis_devisions); f++; } for (int i = 0; i < axis_devisions - 2; ++i) { F(f, 0) = (height_devisions - 1) * axis_devisions; F(f, 1) = ((i + 1) % axis_devisions) + (height_devisions - 1) * axis_devisions; F(f, 2) = ((i + 2) % axis_devisions) + (height_devisions - 1) * axis_devisions; f++; } assert(f == F.rows()); } #ifdef IGL_STATIC_LIBRARY template void igl::cylinder_with_caps, Eigen::Matrix>(int, int, Eigen::PlainObjectBase> &, Eigen::PlainObjectBase> &); #endif