module trapezoid(height=10, x=[30,20], y=[45,40], skew = 0, center=false) { kskew = is_list(skew)?skew:[skew,skew]; kx = is_list(x)?x:[x,x]; ky = is_list(y)?y:[y,y]; off = [kx[0]-kx[1],ky[0]-ky[1]]/2 + kskew; points = [ // bottom rectangle [0,0,0], [kx[0],0,0], [kx[0],ky[0],0], [0, ky[0], 0], // top rectangle [off.x,off.y,height], [off.x+kx[1],off.y,height], [off.x+kx[1],off.y+ky[1], height], [off.x,off.y+ky[1],height] ]; faces = [ [0,1,2,3], // bottom [4,5,1,0], // front [7,6,5,4], // top [5,6,2,1], // right [6,7,3,2], // back [7,4,0,3]]; // left translate(center?[-kx[0]/2,-ky[0]/2,-height/2]:[0,0,0]) polyhedron(points, faces,convexity=2); } module skewed_cube(size, angle=5, center = false) { cSize = is_list(size) ? [size.x, size.y] : [size, size]; cAngle = is_list(angle) ? angle : [0,angle]; ht = is_list(size) ? size.z : size; skew = [ht * tan(cAngle.x), ht * tan(cAngle.y)]; trapezoid(ht, x=cSize.x, y=cSize.y, skew=skew, center=center); } module skewed_cylinder(h=20, d=10, angle=5) { cosA = cos(angle); tanA = tan(angle); xFace = -d/cosA; r=d/2; echo(cosA, xFace); // render(convexity=1) difference() { rotate([angle,0,0]) cylinder(h = h/cosA+d*tanA, d=d, center=true); // #translate([0,(xFace-sign(xFace))/2, h/2+1]) cube([d+2,abs(xFace)+2,d+1], center=true); translate([0, (-tanA*h-sign(h))/2, 1+(h+d)/2]) cube([d,abs(xFace)+2,d+2], center=true); translate([0, (tanA*h+sign(h))/2, -1-(h+d)/2]) cube([d,abs(xFace)+2,d+2], center=true); } } skewed_cube(size=10); //trapezoid(height=16,x=[10,23],y=[10,5],skew=[-2.5,0],center=true); ////translate([0,0,20]) trapezoid(10, 20, 30, 20); //double_trapezoid(10, [20,30], [40,20], false); //translate([0, 0, -5.1]) square([20,30], true); //translate([0, 0, 5.1]) square([40,20], true);