&&&&& Code examples from Chapter 2 &&& Common "library" functions fn ngon! fn cngon! fn arrow! fn flash! &&& FIGURE 16 fn pipegon! (pipe_rad roll_rad & flash_len theta total_angle n) -> { if lt? (n, 1) then cngon! (90, pipe_rad) else { penup! () forward! (add (pipe_rad, roll_rad)) pendown! () left! (mult (total_angle, div (pipe_rad, roll_rad))) & flash! (flash_len) & cngon! (2, roll_rad) arrow! (mult (-1.5, roll_rad)) cngon! (90, roll_rad) rt! (mult (total_angle, div (pipe_rad, roll_rad))) penup! () back! (add (pipe_rad, roll_rad)) left! (theta) pipegon! (pipe_rad roll_rad & flash_len theta add (total_angle theta) dec (n)) } } pipegon! (60, -30, inv (6), 0, 6) &&& FIGURE 17 fn pipegon! (pipe_rad roll_rad & flash_len theta total_angle n) -> { if lt? (n, 1) then cngon! (90, pipe_rad) else { penup! () forward! (add (pipe_rad, roll_rad)) pendown! () left! (mult (total_angle, div (pipe_rad, roll_rad))) & flash! (flash_len) & cngon! (2, roll_rad) arrow! (mult (-1.5, roll_rad)) & cngon! (90, roll_rad) rt! (mult (total_angle, div (pipe_rad, roll_rad))) penup! () back! (add (pipe_rad, roll_rad)) left! (theta) pipegon! (pipe_rad roll_rad & flash_len theta add (total_angle theta) dec (n)) } } pipegon! (60, -30, inv (180), 0, 180) &&& FIGURE 18 fn pipegon! (pipe_rad roll_rad & flash_len theta total_angle n) -> { if lt? (n, 1) then cngon! (90, pipe_rad) else { penup! () forward! (add (pipe_rad, roll_rad)) pendown! () left! (mult (total_angle, div (pipe_rad, roll_rad))) & flash! (flash_len) cngon! (2, roll_rad) & arrow! (mult (-1.5, roll_rad)) & cngon! (90, roll_rad) rt! (mult (total_angle, div (pipe_rad, roll_rad))) penup! () back! (add (pipe_rad, roll_rad)) left! (theta) pipegon! (pipe_rad roll_rad & flash_len theta add (total_angle theta) dec (n)) } } pipegon! (60, -30, inv (180), 0, 180) &&& FIGURE 19 fn pipegon! (pipe_rad roll_rad flash_len theta total_angle n) -> { if lt? (n, 1) then cngon! (90, pipe_rad) else { penup! () forward! (add (pipe_rad, roll_rad)) pendown! () left! (mult (total_angle, div (pipe_rad, roll_rad))) flash! (flash_len) & cngon! (2, roll_rad) & arrow! (mult (-1.5, roll_rad)) & cngon! (90, roll_rad) rt! (mult (total_angle, div (pipe_rad, roll_rad))) penup! () back! (add (pipe_rad, roll_rad)) left! (theta) pipegon! (pipe_rad roll_rad flash_len theta add (total_angle theta) dec (n)) } } pipegon! (60, -30, 40, inv (180), 0, 180) &&& FIGURE 20 & The mathematics of spirographs & The "degree of symmetrey" is the denominator of the & most reduced fraction of the ratio of the two circle dimensions & And, drawing something internally (as opposed to externally) & the star doubles its number of points. & To draw a 40-pointed star (which is what is in _VMwL), you need & a fraction with a prime number in the numerator and 20 in the & denominator. & The other determinant of what the pipegon spirograph looks like & is the frequency with which you draw your "stripe" & I believe the diagrams in the book use 72 iterations/rotation, & for 5ยบ per iteration. That's what's below, but there are many & I prefer. 45 iterations gives a lovely pentagon in the middle, 100 & iteration is lovely. & the iteration of these below is s_pipegon! pipegon! (400, -140, inv (72), 0, mult (1, 72)) pipegon! (400, -140, inv (72), 0, mult (2, 72)) pipegon! (400, -140, inv (72), 0, mult (3, 72)) pipegon! (400, -140, inv (72), 0, mult (4, 72)) pipegon! (400, -140, inv (72), 0, mult (5, 72)) pipegon! (400, -140, inv (72), 0, mult (6, 72)) pipegon! (400, -140, inv (72), 0, mult (7, 72)) &&& FIGURE 21.1-4: larger roller than pipe, internally & Again, all are s_pipegon!s & 21.1 pipegon! (500, -600, inv (72), 0, mult (3, 72)) & 21.2 rt! (inv (18)); pipegon! (450, -500, inv (72), 0, mult (5, 72)) & 21.3 rt! (0.125); pipegon! (400, -600, inv (72), 0, mult (3, 72)) & 21.4 pipegon! (200, -600, inv (72), 0, mult (3, 72))