Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * based off example from https://openhome.cc/eGossip/OpenSCAD/lib3x-path_extrude.html
- **/
- use <dotSCAD/src/shape_circle.scad>
- use <dotSCAD/src/path_extrude.scad>
- use <dotSCAD/src/util/degrees.scad>;
- function double_torus_knot(q, rad, dir, phi_step) =
- [
- for(phi = 0; phi < 6.283185307179586*q[0]; phi = phi + phi_step)
- let(
- phi_deg = degrees(phi),
- l0_deg = -dir[0]*phi_deg,
- l1_deg = phi_deg/q[0],
- l0_pos_x = rad[0]*cos(l0_deg)-rad[0]*sin(l0_deg),
- l0_pos_y = 0,
- l0_pos_z = rad[0]*sin(l0_deg)+rad[0]*cos(l0_deg),
- l1_pos_x = (l0_pos_x+rad[1])*cos(l1_deg)-l0_pos_y*sin(l1_deg),
- l1_pos_y = (l0_pos_x+rad[1])*sin(l1_deg)+l0_pos_y*cos(l1_deg),
- l1_pos_z = l0_pos_z
- )
- [l1_pos_x,
- l1_pos_y,
- l1_pos_z]
- ];
- function triple_torus_knot(q, rad, dir, phi_step) =
- [
- for(phi = 0; phi < 6.283185307179586*q[0]*q[1]; phi = phi + phi_step)
- let(
- phi_deg = degrees(phi),
- l0_deg = -dir[0]*phi_deg,
- l1_deg = phi_deg/q[0],
- l0_pos_x = rad[0]*cos(l0_deg)-rad[0]*sin(l0_deg),
- l0_pos_y = 0,
- l0_pos_z = rad[0]*sin(l0_deg)+rad[0]*cos(l0_deg),
- l1_pos_x = (l0_pos_x+rad[1])*cos(l1_deg)-l0_pos_y*sin(l1_deg),
- l1_pos_y = (l0_pos_x+rad[1])*sin(l1_deg)+l0_pos_y*cos(l1_deg),
- l1_pos_z = l0_pos_z,
- l2_deg = dir[1]*phi_deg/q[0]/q[1],
- l2_pos_x = l1_pos_x,
- l2_pos_y = (l1_pos_y+rad[2])*cos(l2_deg)-l1_pos_z*sin(l2_deg),
- l2_pos_z = (l1_pos_y+rad[2])*sin(l2_deg)+l1_pos_z*cos(l2_deg)
- )
- [l2_pos_x,
- l2_pos_y,
- l2_pos_z]
- ];
- function quad_torus_knot(q, rad, dir, phi_step) =
- [
- for(phi = 0; phi < 6.283185307179586*q[0]*q[1]*q[2]; phi = phi + phi_step)
- let(
- phi_deg = degrees(phi),
- l0_deg = -dir[0]*phi_deg,
- l1_deg = phi_deg/q[0],
- l0_pos_x = rad[0]*cos(l0_deg)-rad[0]*sin(l0_deg),
- l0_pos_y = 0,
- l0_pos_z = rad[0]*sin(l0_deg)+rad[0]*cos(l0_deg),
- l1_pos_x = (l0_pos_x+rad[1])*cos(l1_deg)-l0_pos_y*sin(l1_deg),
- l1_pos_y = (l0_pos_x+rad[1])*sin(l1_deg)+l0_pos_y*cos(l1_deg),
- l1_pos_z = l0_pos_z,
- l2_deg = dir[1]*phi_deg/q[0]/q[1],
- l2_pos_x = l1_pos_x,
- l2_pos_y = (l1_pos_y+rad[2])*cos(l2_deg)-l1_pos_z*sin(l2_deg),
- l2_pos_z = (l1_pos_y+rad[2])*sin(l2_deg)+l1_pos_z*cos(l2_deg),
- l3_deg = -dir[2]*phi_deg/q[0]/q[1]/q[2],
- l3_pos_x = l2_pos_x*cos(l3_deg)-(l2_pos_y+rad[3])*sin(l3_deg),
- l3_pos_y = l2_pos_x*sin(l3_deg)+(l2_pos_y+rad[3])*cos(l3_deg),
- l3_pos_z = l2_pos_z
- )
- [l3_pos_x,
- l3_pos_y,
- l3_pos_z]
- ];
- /**
- * - number of loops per level
- * - radius of torus center line per level
- * - rotation direction 1 clockwise (right-handed?), -1 counter-clockwise (left-handed?)
- * - radian per segment break
- **/
- //pts_1 = double_torus_knot([8], [1,4], [1], 0.5);
- //pts_1 = triple_torus_knot([9,11], [1,4,16], [1,1], 0.5);
- //pts_1 = quad_torus_knot([12,24,24], [1,4,16,64], [1,1,1], 0.5);
- wire_1_cross_section_radius = 0.5;
- wire_1_cross_section_pts = shape_circle(wire_1_cross_section_radius,$fn=10);
- pts_1 = quad_torus_knot([12,24,24], [1,4,16,64], [1,1,1], 0.5);
- path_extrude(
- wire_1_cross_section_pts,
- [each pts_1],
- closed = false,
- twist = 0,
- method = "AXIS_ANGLE"
- );
- wire_2_cross_section_radius = 1;
- wire_2_cross_section_pts = shape_circle(wire_2_cross_section_radius,$fn=10);
- pts_2 = quad_torus_knot([12,24,24], [0,4,16,64], [1,1,1], 0.5);
- color([0,0,0])
- path_extrude(
- wire_2_cross_section_pts,
- [each pts_2],
- closed = false,
- twist = 0,
- method = "AXIS_ANGLE"
- );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement