diff --git a/ch_2_code.ld b/ch_2_code.ld new file mode 100644 index 0000000..53ece16 --- /dev/null +++ b/ch_2_code.ld @@ -0,0 +1,176 @@ +&&&&& 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))