// Lampshade $fn=128; function f(z) = 0.15 + .1 * sin(1.5 * z) + .06 * cos(1 * z); vase_height = 160; vase_radius = 200; step = 1; twist = 1.4; sh3_nodes = 4; //sh3 = [0,30,60,90,120,180,210,240,270,300,330,360]; // polygon being extruded sh3 = [ for (i = [1:sh3_nodes]) i*(360/sh3_nodes) ]; p = [ for (z = [0:step:vase_height], angle = sh3) [ vase_radius*cos(angle+twist*z)*f(z), vase_radius*sin(angle+twist*z)*f(z), z ] ]; module shape(p,m,n) { fcs = [for (j = [1:m], i = [0:n-2])[(n*j)+i,(n*j)+1+i,(n*(j-1))+i+1,(n*(j-1))+i]]; top = [for (i = [n*m:(n*m)+n-1]) i]; //connect points to create the top face bottom = [for (i = [0:n-1]) i]; //connect points to create the bottom stitches = [for (j = [0:m-1]) [j*n,((j+1)*n)-1,(((j+2)*n)-1),(j+1)*n]]; //connect points between the first and the last face per row //now connect all //reverse is used to reverse normal of top face fcsc = concat([bottom],fcs,stitches,[reverse(top)]); //concatenate the bottom, body and top color("blue") polyhedron(points=p, faces=fcsc); } function reverse(lt) = [for(i = len(lt) - 1; i > -1; i = i - 1) lt[i]]; m = floor(vase_height/step); //numbers of rows of the matrix n = len(sh3); //number of columns in the matrix for ( i = [0 : 23] ) { rotate([0,0,15*i]) shape(p,m,n); }; mirror([1,0,0]) for ( i = [0 : 23] ) { rotate([0,0,15*i]) shape(p,m,n); };