//=========================================== // Public Domain Epi- and Hypo- trochoids in OpenSCAD // version 1.0 // by Matt Moses, 2011, mmoses152@gmail.com // http://www.thingiverse.com/thing:8067 // // This file is public domain. Use it for any purpose, including commercial // applications. Attribution would be nice, but is not required. There is // no warranty of any kind, including its correctness, usefulness, or safety. // // An EPITROCHOID is a curve traced by a point // fixed at a distance "d" // to the center of a circle of radius "r" // as the circle rolls // outside another circle of radius "R". // // An HYPOTROCHOID is a curve traced by a point // fixed at a distance "d" // to the center of a circle of radius "r" // as the circle rolls // inside another circle of radius "R". // // An EPICYCLOID is an epitrochoid with d = r. // // An HYPOCYCLOID is an hypotrochoid with d = r. // // See http://en.wikipedia.org/wiki/Epitrochoid // and http://en.wikipedia.org/wiki/Hypotrochoid // // Beware the polar forms of the equations on Wikipedia... // They are correct, but theta is measured to the center of the small disk!! //=========================================== // There are several different methods for extruding. The best are probably // the ones using linear extrude. //=========================================== // Demo - draws one of each, plus some little wheels and sticks. // // Fun stuff to try: // Animate, try FPS = 5 and Steps = 200 // R = 2, r = 1, d = 0.2 // R = 4, r = 1, d = 1 // R = 2, r = 1, d = 0.5 // // What happens when you make d > r ?? // What happens when d < 0 ?? // What happens when r < 0 ?? // //=========================================== $fn = 30; thickness = 2; R = 4; r = 1; d = 1; n = 60; // number of wedge segments alpha = 360*$t; color([0, 0, 1]) translate([0, 0, -0.5]) cylinder(h = 1, r= R, center = true); color([0, 1, 0]) epitrochoid(R,r,d,n,thickness); color([1, 0, 0]) translate([ (R+r)*cos(alpha) , (R+r)*sin(alpha), -0.5]) { rotate([0, 0, alpha + R/r*alpha]) { cylinder(h = 1, r = r, center = true); translate([-d, 0, 1.5]) { cylinder(h = 2.2, r = 0.1, center = true); } } } translate([2*(abs(R) + abs(r) + abs(d)), 0, 0]){ color([0, 0, 1]) translate([0, 0, -0.5]) difference() { cylinder(h = 1, r = 1.1*R, center = true); cylinder(h = 1.1, r= R, center = true); } color([0, 1, 0]) hypotrochoid(R,r,d,n,thickness); color([1, 0, 0]) translate([ (R-r)*cos(alpha) , (R-r)*sin(alpha), -0.5]) { rotate([0, 0, alpha - R/r*alpha]) { cylinder(h = 1, r = r, center = true); translate([d, 0, 1.5]) { cylinder(h = 2.2, r = 0.1, center = true); } } } } // This just makes a twisted hypotrochoid translate([0,14, 0]) hypotrochoidLinear(4, 1, 1, 40, 40, 10, 30); // End of Demo Section //=========================================== //=========================================== // Epitrochoid // module epitrochoid(R, r, d, n, thickness) { dth = 360/n; for ( i = [0:n-1] ) { polyhedron(points = [[0,0,0], [(R+r)*cos(dth*i) - d*cos((R+r)/r*dth*i), (R+r)*sin(dth*i) - d*sin((R+r)/r*dth*i), 0], [(R+r)*cos(dth*(i+1)) - d*cos((R+r)/r*dth*(i+1)), (R+r)*sin(dth*(i+1)) - d*sin((R+r)/r*dth*(i+1)), 0], [0,0,thickness], [(R+r)*cos(dth*i) - d*cos((R+r)/r*dth*i), (R+r)*sin(dth*i) - d*sin((R+r)/r*dth*i), thickness], [(R+r)*cos(dth*(i+1)) - d*cos((R+r)/r*dth*(i+1)), (R+r)*sin(dth*(i+1)) - d*sin((R+r)/r*dth*(i+1)), thickness]], triangles = [[0, 2, 1], [0, 1, 3], [3, 1, 4], [3, 4, 5], [0, 3, 2], [2, 3, 5], [1, 2, 4], [2, 5, 4]]); } } //=========================================== //=========================================== // Hypotrochoid // module hypotrochoid(R, r, d, n, thickness) { dth = 360/n; for ( i = [0:n-1] ) { polyhedron(points = [[0,0,0], [(R-r)*cos(dth*i) + d*cos((R-r)/r*dth*i), (R-r)*sin(dth*i) - d*sin((R-r)/r*dth*i), 0], [(R-r)*cos(dth*(i+1)) + d*cos((R-r)/r*dth*(i+1)), (R-r)*sin(dth*(i+1)) - d*sin((R-r)/r*dth*(i+1)), 0], [0,0,thickness], [(R-r)*cos(dth*i) + d*cos((R-r)/r*dth*i), (R-r)*sin(dth*i) - d*sin((R-r)/r*dth*i), thickness], [(R-r)*cos(dth*(i+1)) + d*cos((R-r)/r*dth*(i+1)), (R-r)*sin(dth*(i+1)) - d*sin((R-r)/r*dth*(i+1)), thickness]], triangles = [[0, 2, 1], [0, 1, 3], [3, 1, 4], [3, 4, 5], [0, 3, 2], [2, 3, 5], [1, 2, 4], [2, 5, 4]]); } } //=========================================== //=========================================== // Epitrochoid Wedge with Bore // module epitrochoidWBore(R, r, d, n, p, thickness, rb) { dth = 360/n; union() { for ( i = [0:p-1] ) { polyhedron(points = [[rb*cos(dth*i), rb*sin(dth*i),0], [(R+r)*cos(dth*i) - d*cos((R+r)/r*dth*i), (R+r)*sin(dth*i) - d*sin((R+r)/r*dth*i), 0], [(R+r)*cos(dth*(i+1)) - d*cos((R+r)/r*dth*(i+1)), (R+r)*sin(dth*(i+1)) - d*sin((R+r)/r*dth*(i+1)), 0], [rb*cos(dth*(i+1)), rb*sin(dth*(i+1)), 0], [rb*cos(dth*i), rb*sin(dth*i), thickness], [(R+r)*cos(dth*i) - d*cos((R+r)/r*dth*i), (R+r)*sin(dth*i) - d*sin((R+r)/r*dth*i), thickness], [(R+r)*cos(dth*(i+1)) - d*cos((R+r)/r*dth*(i+1)), (R+r)*sin(dth*(i+1)) - d*sin((R+r)/r*dth*(i+1)), thickness], [rb*cos(dth*(i+1)), rb*sin(dth*(i+1)), thickness]], triangles = [[0, 1, 4], [4, 1, 5], [1, 2, 5], [5, 2, 6], [2, 3, 7], [7, 6, 2], [3, 0, 4], [4, 7, 3], [4, 5, 7], [7, 5, 6], [0, 3, 1], [1, 3, 2]]); } } } //=========================================== //=========================================== // Epitrochoid Wedge with Bore, Linear Extrude // module epitrochoidWBoreLinear(R, r, d, n, p, thickness, rb, twist) { dth = 360/n; linear_extrude(height = thickness, convexity = 10, twist = twist) { union() { for ( i = [0:p-1] ) { polygon(points = [[rb*cos(dth*i), rb*sin(dth*i)], [(R+r)*cos(dth*i) - d*cos((R+r)/r*dth*i), (R+r)*sin(dth*i) - d*sin((R+r)/r*dth*i)], [(R+r)*cos(dth*(i+1)) - d*cos((R+r)/r*dth*(i+1)), (R+r)*sin(dth*(i+1)) - d*sin((R+r)/r*dth*(i+1))], [rb*cos(dth*(i+1)), rb*sin(dth*(i+1))]], paths = [[0, 1, 2, 3]], convexity = 10); } } } } //=========================================== //=========================================== // Epitrochoid Wedge, Linear Extrude // module epitrochoidLinear(R, r, d, n, p, thickness, twist) { dth = 360/n; linear_extrude(height = thickness, convexity = 10, twist = twist) { union() { for ( i = [0:p-1] ) { polygon(points = [[0, 0], [(R+r)*cos(dth*i) - d*cos((R+r)/r*dth*i), (R+r)*sin(dth*i) - d*sin((R+r)/r*dth*i)], [(R+r)*cos(dth*(i+1)) - d*cos((R+r)/r*dth*(i+1)), (R+r)*sin(dth*(i+1)) - d*sin((R+r)/r*dth*(i+1))]], paths = [[0, 1, 2]], convexity = 10); } } } } //=========================================== //=========================================== // Hypotrochoid Wedge with Bore // module hypotrochoidWBore(R, r, d, n, p, thickness, rb) { dth = 360/n; union() { for ( i = [0:p-1] ) { polyhedron(points = [[rb*cos(dth*i), rb*sin(dth*i),0], [(R-r)*cos(dth*i) + d*cos((R-r)/r*dth*i), (R-r)*sin(dth*i) - d*sin((R-r)/r*dth*i), 0], [(R-r)*cos(dth*(i+1)) + d*cos((R-r)/r*dth*(i+1)), (R-r)*sin(dth*(i+1)) - d*sin((R-r)/r*dth*(i+1)), 0], [rb*cos(dth*(i+1)), rb*sin(dth*(i+1)), 0], [rb*cos(dth*i), rb*sin(dth*i), thickness], [(R-r)*cos(dth*i) + d*cos((R-r)/r*dth*i), (R-r)*sin(dth*i) - d*sin((R-r)/r*dth*i), thickness], [(R-r)*cos(dth*(i+1)) + d*cos((R-r)/r*dth*(i+1)), (R-r)*sin(dth*(i+1)) - d*sin((R-r)/r*dth*(i+1)), thickness], [rb*cos(dth*(i+1)), rb*sin(dth*(i+1)), thickness]], triangles = [[0, 1, 4], [4, 1, 5], [1, 2, 5], [5, 2, 6], [2, 3, 7], [7, 6, 2], [3, 0, 4], [4, 7, 3], [4, 5, 7], [7, 5, 6], [0, 3, 1], [1, 3, 2]]); } } } //=========================================== //=========================================== // Hypotrochoid Wedge with Bore, Linear Extrude // module hypotrochoidWBoreLinear(R, r, d, n, p, thickness, rb, twist) { dth = 360/n; linear_extrude(height = thickness, convexity = 10, twist = twist) { union() { for ( i = [0:p-1] ) { polygon(points = [[rb*cos(dth*i), rb*sin(dth*i)], [(R-r)*cos(dth*i) + d*cos((R-r)/r*dth*i), (R-r)*sin(dth*i) - d*sin((R-r)/r*dth*i)], [(R-r)*cos(dth*(i+1)) + d*cos((R-r)/r*dth*(i+1)), (R-r)*sin(dth*(i+1)) - d*sin((R-r)/r*dth*(i+1))], [rb*cos(dth*(i+1)), rb*sin(dth*(i+1))]], paths = [[0, 1, 2, 3]], convexity = 10); } } } } //=========================================== //=========================================== // Hypotrochoid Wedge, Linear Extrude // module hypotrochoidLinear(R, r, d, n, p, thickness, twist) { dth = 360/n; linear_extrude(height = thickness, convexity = 10, twist = twist) { union() { for ( i = [0:p-1] ) { polygon(points = [[0, 0], [(R-r)*cos(dth*i) + d*cos((R-r)/r*dth*i), (R-r)*sin(dth*i) - d*sin((R-r)/r*dth*i)], [(R-r)*cos(dth*(i+1)) + d*cos((R-r)/r*dth*(i+1)), (R-r)*sin(dth*(i+1)) - d*sin((R-r)/r*dth*(i+1))]], paths = [[0, 1, 2]], convexity = 10); } } } } //===========================================