#!/usr/bin/ucblogo ; Copyright 2012, 2013, 2014 Kevin Ryde ; ; This file is part of Math-PlanePath. ; ; Math-PlanePath is free software; you can redistribute it and/or modify it ; under the terms of the GNU General Public License as published by the Free ; Software Foundation; either version 3, or (at your option) any later ; version. ; ; Math-PlanePath is distributed in the hope that it will be useful, but ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ; for more details. ; ; You should have received a copy of the GNU General Public License along ; with Math-PlanePath. If not, see . ; Usage: ucblogo dragon-curve-turns.logo ; ; Plot the dragon curve using bit-twiddling to turn the turtle left or ; right, as described for example in "Turn" of ; Math::PlanePath::DragonCurve and variously elsewhere. ; ; The commented out "dragon.chamfer 256" is an alternative plot with ; the corners rounded off to help see the shape. ; ; ; See also: ; ; Mark Horney, "Fractals I: Making Recursion Visible", Logo Exchange, ; Volume 9, number 1, September 1990, pages 23-29. ; Mark Horney, "Fractals II: Representation, Logo Exchange, Volume 9, ; number 2, October 1990, pages 26-29. ; http://el.media.mit.edu/logo-foundation/pubs/nlx.html ; http://el.media.mit.edu/logo-foundation/pubs/nlx/v9/Vol9No1.pdf ; http://el.media.mit.edu/logo-foundation/pubs/nlx/v9/Vol9No2.pdf ; Return the bit above the lowest 1-bit in :n. ; If :n = binary "...z100..00" then the return is "z000..00". ; Eg. n=22 is binary 10110 the lowest 1-bit is the "...1." and the return is ; bit above that "..1.," which is 4. to bit.above.lowest.1bit :n output bitand :n (1 + (bitxor :n (:n - 1))) end ; Return angle +90 or -90 for dragon curve turn at point :n. ; The curve is reckoned as starting from n=0 so the first turn is at n=1. to dragon.turn.angle :n output ifelse (bit.above.lowest.1bit :n) = 0 [90] [-90] end ; Draw :steps many segments of the dragon curve. to dragon :steps localmake "step.len 12 ; length of each step repeat :steps [ forward :step.len left dragon.turn.angle repcount ; repcount = 1 to :steps inclusive ] end ; Draw :steps many segments of the dragon curve, with corners chamfered ; off with little 45-degree diagonals. ; Done this way the vertices don't touch. to dragon.chamfer :steps localmake "step.len 12 ; length of each step localmake "straight.frac 0.5 ; fraction of the step to go straight localmake "straight.len :step.len * :straight.frac localmake "diagonal.len (:step.len - :straight.len) * sqrt(1/2) repeat :steps [ localmake "turn (dragon.turn.angle repcount)/2 ; +45 or -45 forward :straight.len left :turn forward :diagonal.len left :turn ] end dragon 256 ; dragon.chamfer 256