import numpy as np from geometry import Mesh def cylinder(radius=1.0, height=1.0, theta=np.pi/32): angles = np.arange(0, 2*np.pi, theta) vertices = np.empty((2*len(angles) + 2, 3), dtype=np.float32) vertices[:2*len(angles),0] = radius*np.tile(np.cos(angles),2) vertices[:2*len(angles),1] = radius*np.tile(np.sin(angles),2) vertices[:len(angles),2] = height/2.0 vertices[len(angles):2*len(angles),2] = -height/2.0 vertices[-2] = [0,0,height/2.0] vertices[-1] = [0,0,-height/2.0] triangles = np.zeros((len(angles)*4, 3), dtype=np.uint32) # top triangles[:len(angles),0] = np.arange(len(angles)) triangles[:len(angles),2] = np.roll(np.arange(len(angles)),1) triangles[:len(angles),1] = len(vertices) - 2 # bottom triangles[len(angles):2*len(angles),0] = \ np.arange(len(angles),2*len(angles)) triangles[len(angles):2*len(angles),1] = \ np.roll(np.arange(len(angles),2*len(angles)),1) triangles[len(angles):2*len(angles),2] = len(vertices) - 1 # side triangles[2*len(angles):3*len(angles),0] = np.arange(len(angles)) triangles[2*len(angles):3*len(angles),2] = \ np.arange(len(angles),2*len(angles)) triangles[2*len(angles):3*len(angles),1] = \ np.roll(np.arange(len(angles),2*len(angles)),1) # side triangles[3*len(angles):4*len(angles),0] = np.arange(len(angles)) triangles[3*len(angles):4*len(angles),2] = \ np.roll(np.arange(len(angles),2*len(angles)),1) triangles[3*len(angles):4*len(angles),1] = \ np.roll(np.arange(len(angles)),1) return Mesh(vertices, triangles)