Tuesday, December 17, 2013

Day 113 - Poly-Snaps Truncated Tetrahedron

Over the next six days we'll be posting polyhedra that we assembled using our new Poly-Snaps on Thingiverse. Our previous polyhedral models were made from Snap Tiles which had either two or three snaps on each side. This new type of modular polyhedra-builder has the same number of snaps on each side and is customizable in Thingiverse Customizer. Today's print is a Truncated Tetrahedron composed of four triangles and four hexagons:


Thingiverse link: http://www.thingiverse.com/thing:208591

Settings: MakerWare .3mm/low in two batches (to get the two colors).

Technical notes: We used the following settings in the Thingiverse Customizer, which makes a sturdy, compact model that can be difficult to put together but stays together well even when tossed around.
Sides = 3 and 6
Snaps = 3
Side Length = 25
Thickness = 3.5
Border = 3.5
Clearance = .17
Lengthen = .3 
Technical notes, OpenSCAD flavor: This is one of my first OpenSCAD designs so it is kind of a hack, but here is the code I wrote to make the Poly-Snap tiles:

// mathgrrl polysnap tiles

////////////////////////////////////////////////////////////////
// PARAMETERS //////////////////////////////////////////////////

/* [Shape] */

// Choose the number of sides for the tile
sides = 5; // [3,4,5,6,7,8,9,10,11,12]

// Choose the number of snaps on each side
snaps = 3; // [2,3,4,5,6,7,8]

/* [Size] */

// Set the length of each side, in mm
side_length = 25; 

// Set the thickness of the tile, in mm
thickness = 3.5;

// Set the border thickness, in mm
border = 3.5;

/* [Adjust Fit] */

// Add extra space between snaps, in mm
clearance = .17;

// Add extra length to the snaps, in mm
lengthen = .3;

//radius depends on side length
radius = side_length/(2*sin(180/sides)); 

//inside radius depends on the border thickness
inside = radius-border/(cos(180/sides)); 

//width of each snap depends on number of snaps
snapwidth = radius*sin(180/sides)/snaps;

////////////////////////////////////////////////////////////////
// RENDERS /////////////////////////////////////////////////////

union(){
//make the polygon base
poly_maker();

//make the snaps
snap_maker();
}

////////////////////////////////////////////////////////////////
// MODULES /////////////////////////////////////////////////////

//build the polygon shape of the tile
//shape is made up of n=sides wedges that are rotated around
module poly_maker(){

//subtract the smaller polygon from the larger polygon
difference(){

//extrude to thicken the polygon
linear_extrude(height=thickness,center=true){ 

//rotate the wedge n=sides times at angle of 360/n each time
for(i=[0:sides]){

//rotation is around the z-axis [0,0,1]
rotate(i*360/sides,[0,0,1])

//make triangular wedge with angle based on number of sides
polygon(

//the three vertices of the triangle
points = [[0-.1,0-.1], //tweaks fix CGAL errors
[radius,0-.01],
[radius*cos(360/sides)-.01,radius*sin(360/sides)+.01]],

//the order to connect the three vertices above
paths = [[0,1,2]]
);
}
}
//extrude to thicken the center polygon that will be the hole
linear_extrude(height=thickness+2,center=true){ 

//rotate the wedge n=sides times at angle of 360/n each time
for(i=[0:sides]){

//rotation is around the z-axis [0,0,1]
rotate(i*360/sides,[0,0,1])

//make triangular wedge with angle based on number of sides
polygon(

//the three vertices of the triangle
points = [[0-.2,0-.2], //tweaks fix CGAL errors
[inside,0-.01],
[inside*cos(360/sides)-.01,inside*sin(360/sides)+.01]],

//the order to connect the three vertices above
paths = [[0,1,2]]
);
}
}
}
}

//build the snaps around the tile
//try the commands alone with i=1 and i=2 to see how this works
//remember to read from the bottom to the top to make sense of this
module snap_maker(){

//rotate the side of snaps n=sides times at angle of 360/n each time
for(i=[0:sides]){ 

//rotation is around the z-axis [0,0,1]
rotate(i*360/sides,[0,0,1])

//build snaps for first side at the origin and move into positions
for(i=[0:snaps-1]){

//read the rest of the commands from bottom to top
//translate the snap to the first side
translate([radius,0,-thickness/2]) 

//rotate the snap to correct angle for first side
rotate(180/sides) 

//for i^th snap translate 2*i snapwidths over from origin
translate([0,2*i*snapwidth,0]) 

//rounded box for snap made from a box and cylinder
union(){

//cube part of snap shape at the origin
cube([thickness/2+lengthen,snapwidth-clearance,thickness]);

//post at back of snap to avoid loose teeth
//shifted a bit right to avoid overhangs when sides=3
translate([-.5,.5,0])
cube([thickness/2,snapwidth-clearance-.5,thickness]);

//round part of snap shape at the origin
//move cylinder to the end of the box
translate([thickness/2+lengthen,
                   snapwidth-clearance,
                   thickness/2])
//rotate cylinder to match box orientation
rotate(90,[0,1,0]) 
rotate(90,[1,0,0]) 

//cylinder of the correct size to match box
cylinder(
r=thickness/2,
h=snapwidth-clearance,
$fn=16  //number of sides
);
}
}
}


Update: These Poly-Snap triangle tiles were used by owens on Thingiverse to make a beautiful model of a toroidal polyhedron. So cool!

No comments:

Post a Comment