% Copyright 2013, 2014 Kevin Ryde
%
% This file 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.
%
% This file 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 this file. If not, see .
% Usage: tex dragon-pgf-plain.tex
% xdvi dragon-pgf-plain.dvi
%
% This a dragon curve drawn with the PGF lindenmayersystems library.
%
% http://sourceforge.net/projects/pgf/
%
% The PGF manual under "lindenmayersystems" includes examples of Koch
% snowflake, Hilbert curve and Sierpinski arrowhead. In the "spy"
% library section there's some magnifications of the Koch and of a
% quadric curve too.
%
% In the rule here \symbol{S} is a second drawing symbol. It draws a
% line segment the same as F, but the two different symbols let the
% rules distinguish odd and even position line segments.
%
% F and S are always in pairs, F first and S second, so
%
% F_S_F_S_F_S_F_S...
%
% At each even position F expands to a left bend, ie with a "+" turn.
% At each odd position S expands to a right bend, ie with a "-". This
% is the "expansion" method for generating the curve where each line
% segment is replaced by a bend to the left or right according to even
% or odd position.
%
% The sequence of + and - turns resulting in the expansion follows
% the "bit above lowest 1-bit" rule. This works essentially because
% the bit above obeys an expansion rule
%
% if k even
% bitabovelowest1bit(2k) = bitabovelowest1bit(k)
% bitabovelowest1bit(2k+1) = 0 # the "+" in F -> F+S
%
% if k odd
% bitabovelowest1bit(2k) = bitabovelowest1bit(k)
% bitabovelowest1bit(2k+1) = 1 # the "-" in S -> F-S
%
\input tikz.tex
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{Dragon curve}{
\symbol{S}{\pgflsystemdrawforward}
\rule{F -> F+S}
\rule{S -> F-S}
}
\tikzpicture
\draw
[lindenmayer system={Dragon curve, step=10pt, axiom=F, order=8}]
lindenmayer system;
\endtikzpicture
\bye