MCAD-Library/trochoids.scad

291 lines
9.2 KiB
OpenSCAD
Raw Normal View History

//===========================================
// 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);
}
}
}
}
//===========================================