Welcome to MakerHome




We've completed our yearlong print-a-day project!
All new material is now at Hacktastic: www.mathgrrl.com


Thursday, May 29, 2014

Day 276 - Petal conformation of 6_2

Today is my favorite from the 3D-Printed Conformations of Knots through 7 Crossings series that my Math 297 students developed last semester in the JMU 3-SPACE classroom. It's a petal knot conformation of 6_2, which means that there is an angle from which all of the crossings line up on top of one another to form a single daisy-like crossing. Colin Adams of Williams College, together with an army of amazing students, proved recently that every knot has a petal conformation. They also came up with explicit constructions for some of those conformations, one of which we used to print today's model:


Thingiverse link: http://www.thingiverse.com/make:80268

Settings: Printed on a Replicator 2 with our usual custom knot slicing profile.

Technical notes, Mathematica flavor: Today's petal knot was designed and printed by JMU Student Jonathan Gerhard, using the method from Day 152 and data sent to us by Adams' student Daniel Vitek. Here's Jonathan's walkthough of what he did:

The data for the petal knot conformation of 6_2 came in the form of 500 points in space determined by the following Mathematica code:

Bumps[t_, n_] := If[Abs[Mod[t, n, -n/2]] > 1, 0, Cos[π*Mod[t, n, -n/2]/2]^2];

BumpSum[p_, t_] := Sum[p[[i]]*Bumps[t + 1 - i, Length[p]], {i, 1, Length[p]}];

PetalPlot[p_] := ParametricPlot3D[{
 Sin[π*t]*Cos[π*t/Length[p]], 
 Sin[π*t]*Sin[π*t/Length[p]], 
 BumpSum[p, t]},
 {t, 0, Length[p]}];

p = {1, 3, 5, 2, 8, 4, 7, 9, 6};

points = N[{Sin[π*t]*Cos[π*t/Length[p]], Sin[π*t]*Sin[π*t/Length[p]],
     BumpSum[p, t]} /. ({t -> #} & /@ (Range[0, 500]/500*Length[p]))];

ListPointPlot3D[points]

Petal62Points.jpg

To get a smooth representation we could just use Tube in Mathematica, as follows:

Graphics3D[Tube[points, .075]]

62PetalThick.jpg

This looked good, however, it was very tall. So I modified it by changing the BumpSum[p, t]} in PetalPlot[p_] to 0.26BumpSum[p, t]}to make the height smaller.

Mathematica models can sometimes export badly, so instead of using the Tube model above I used the OpenSCAD technique we've been using for our data-defined knots (see for example Day 272). To do this, I first had to open the 500 Mathematica datapoints in TextEdit and run a "Find and Replace" to change all “{“s to “[“ and all “}” to “],”s.  Then I input the reformatted data points into the following OpenScad code (not all of the points are included here because there are so many!):

Paths = [[
[0., 0., 0.26],[0.05651741885454146, 0.00035511408887296787, 0.26041559697166655],[0.11284747420775955, 0.0014181578334111625, 0.2616610592647978],[0.16880345185324083, 0.0031822470046126636, 0.2637324052612605],[0.22419993383963085, 0.005635945627807872, 0.2666230130754899],[0.27885344076990115, 0.008763322416738774, 0.27032364172399476],
%...lots of data points
[-0.27885344076990115, 0.008763322416738774, 0.28580910430998696],[-0.22419993383963085, 0.005635945627807872, 0.27655753268872485],[-0.16880345185324083, 0.0031822470046126636, 0.26933101315315133],[-0.11284747420775955, 0.0014181578334111625, 0.2641526481619946],[-0.05651741885454146, 0.00035511408887296787, 0.26103899242916623],[0., 0., 0.26],[0.05651741885454146, 0.00035511408887296787, 0.26041559697166655],
]];
// Sides of the tube
Sides = 30;
// Radius of tube
Radius = .1;
//Scale of knot
Scale= 3;

Colors = [[1,0,0],[0,1,0],[0,0,1],[1,1,0],[1,0,1],[0,1,1]];
module disc_p2p(p1, p2, r) {
  assign(p = p2 - p1)
  translate(p1 + p/2)
    rotate([0, 0, atan2(p[1], p[0])])
    rotate([0, atan2(sqrt(pow(p[0], 2)+pow(p[1], 2)),p[2]), 0])
    render() cylinder(h = 0.1, r1 = r, r2 = 0);
};

module knot_path(path,r) {
  for (t = [0: 1: len(path)-1 ])
    assign (p0 = path[t],
      p1 = path[(t + 1) % len(path)],
      p2 = path[(t + 2) % len(path)] )
    hull() {
      disc_p2p (p0,p1,r);
      disc_p2p (p1,p2,r);
    }
};

module knot(paths,r)
  for (i = [0:1:len(paths)-1])
    color(Colors[i])
     knot_path(paths[i],r);

$fn=Sides;
scale(Scale)
knot(Paths,Radius);

Compile and render this by hitting “F6”. Once it finishes (which will take forever), go to the OpenSCAD Design menu and choose “Export as STL”. And you’re done!