% Copyright 2006 by Till Tantau % % This file may be distributed and/or modified % % 1. under the LaTeX Project Public License and/or % 2. under the GNU Public License. % % See the file doc/generic/pgf/licenses/LICENSE for more details. \ProvidesFileRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/libraries/pgflibrarysnakes.code.tex,v 1.14 2006/10/11 15:22:26 tantau Exp $ \newdimen\pgfsnakesegmentamplitude \newdimen\pgfsnakesegmentlength \def\pgfsnakesegmentangle{45} \def\pgfsnakesegmentobjectlength{\pgfsnakesegmentamplitude} \def\pgfsnakesegmentaspect{0.5} \pgfsnakesegmentlength=10pt \pgfsnakesegmentamplitude=2.5pt % snake snake % % This snake produces a hopefully optically pleasing squiggly snake. % % Parameters: \pgfsnakesegmentamplitude, \pgfsnakesegmentlength \pgfdeclaresnake{snake}{initial} { \state{initial}[switch if less than=.625\pgfsnakesegmentlength to final, width=.3125\pgfsnakesegmentlength, next state=down] { \pgfpathcurveto {\pgfpoint{.125\pgfsnakesegmentlength}{0pt}} {\pgfpoint{.1875\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} {\pgfpoint{.3125\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} } \state{down}[switch if less than=.8125\pgfsnakesegmentlength to end down, width=.5\pgfsnakesegmentlength, next state=up] { \pgfpathcosine{\pgfpoint{.25\pgfsnakesegmentlength}{-\pgfsnakesegmentamplitude}} \pgfpathsine{\pgfpoint{.25\pgfsnakesegmentlength}{-\pgfsnakesegmentamplitude}} } \state{up}[switch if less than=.8125\pgfsnakesegmentlength to end up, width=.5\pgfsnakesegmentlength, next state=down] { \pgfpathcosine{\pgfpoint{.25\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} \pgfpathsine{\pgfpoint{.25\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} } \state{end down}[width=.3125\pgfsnakesegmentlength, next state=final] { \pgfpathcurveto {\pgfpoint{.125\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} {\pgfpoint{.1875\pgfsnakesegmentlength}{0pt}} {\pgfpoint{.3125\pgfsnakesegmentlength}{0pt}} } \state{end up}[width=.3125\pgfsnakesegmentlength, next state=final] { \pgfpathcurveto {\pgfpoint{.125\pgfsnakesegmentlength}{-\pgfsnakesegmentamplitude}} {\pgfpoint{.1875\pgfsnakesegmentlength}{0pt}} {\pgfpoint{.3125\pgfsnakesegmentlength}{0pt}} } \state{final} { \pgfpathlineto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % zigzag snake % % Parameters: \pgfsnakesegmentamplitude, \pgfsnakesegmentlength \pgfdeclaresnake{zigzag}{up} { \state{up}[width=.5\pgfsnakesegmentlength,% next state=down] { \pgfpathlineto{\pgfpoint{.25\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{.5\pgfsnakesegmentlength}{0pt}} } \state{down}[width=.5\pgfsnakesegmentlength,% next state=up] { \pgfpathlineto{\pgfpoint{.25\pgfsnakesegmentlength}{-\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{.5\pgfsnakesegmentlength}{0pt}} } \state{final} { \pgfpathlineto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % saw snake % % Parameters: \pgfsnakesegmentamplitude, \pgfsnakesegmentlength \pgfdeclaresnake{saw}{initial} { \state{initial}[width=\pgfsnakesegmentlength] { \pgfpathlineto{\pgfpoint{\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{\pgfsnakesegmentlength}{0pt}} } \state{final} { \pgfpathlineto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % coil snake % % Parameters: \pgfsnakesegmentamplitude, \pgfsnakesegmentlength, \pgfdeclaresnake{coil}{coil} { \state{coil}[switch if less than=% 1.5\pgfsnakesegmentlength+% \pgfsnakesegmentaspect\pgfsnakesegmentamplitude+% \pgfsnakesegmentaspect\pgfsnakesegmentamplitude to last, width=\pgfsnakesegmentlength] { \pgfpathcurveto {\pgfpoint@oncoil{0 }{ 0.555}{1}} {\pgfpoint@oncoil{0.445}{ 1 }{2}} {\pgfpoint@oncoil{1 }{ 1 }{3}} \pgfpathcurveto {\pgfpoint@oncoil{1.555}{ 1 }{4}} {\pgfpoint@oncoil{2 }{ 0.555}{5}} {\pgfpoint@oncoil{2 }{ 0 }{6}} \pgfpathcurveto {\pgfpoint@oncoil{2 }{-0.555}{7}} {\pgfpoint@oncoil{1.555}{-1 }{8}} {\pgfpoint@oncoil{1 }{-1 }{9}} \pgfpathcurveto {\pgfpoint@oncoil{0.445}{-1 }{10}} {\pgfpoint@oncoil{0 }{-0.555}{11}} {\pgfpoint@oncoil{0 }{ 0 }{12}} } \state{last}[width=.5\pgfsnakesegmentlength+% \pgfsnakesegmentaspect\pgfsnakesegmentamplitude+% \pgfsnakesegmentaspect\pgfsnakesegmentamplitude,next state=final] { \pgfpathcurveto {\pgfpoint@oncoil{0 }{ 0.555}{1}} {\pgfpoint@oncoil{0.445}{ 1 }{2}} {\pgfpoint@oncoil{1 }{ 1 }{3}} \pgfpathcurveto {\pgfpoint@oncoil{1.555}{ 1 }{4}} {\pgfpoint@oncoil{2 }{ 0.555}{5}} {\pgfpoint@oncoil{2 }{ 0 }{6}} } \state{final} { \pgfpathlineto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } \def\pgfpoint@oncoil#1#2#3{% \pgf@x=#1\pgfsnakesegmentamplitude% \pgf@x=\pgfsnakesegmentaspect\pgf@x% \pgf@y=#2\pgfsnakesegmentamplitude% \pgf@xa=0.083333333333\pgfsnakesegmentlength% \advance\pgf@x by#3\pgf@xa% } % bumps snake % % Parameters: \pgfsnakesegmentamplitude, \pgfsnakesegmentlength \pgfdeclaresnake{bumps}{initial} { \state{initial}[width=.5\pgfsnakesegmentlength] { \pgfpathcurveto {\pgfpoint{0pt}{.555\pgfsnakesegmentamplitude}} {\pgfpoint{0.11125\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} {\pgfpoint{.25\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} \pgfpathcurveto {\pgfpoint{.38875\pgfsnakesegmentlength}{\pgfsnakesegmentamplitude}} {\pgfpoint{.5\pgfsnakesegmentlength}{.5\pgfsnakesegmentamplitude}} {\pgfpoint{.5\pgfsnakesegmentlength}{0\pgfsnakesegmentamplitude}} } \state{final} { \pgfpathlineto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % expanding waves snake % % Parameters: \pgfsnakesegmentangle, \pgfsnakesegmentlength \pgfdeclaresnake{expanding waves}{initial} { \state{initial}[width=\pgfsnakesegmentlength,next state=wave] {} \state{wave}[switch if less than=\pgfsnakesegmentlength to last, width=\pgfsnakesegmentlength] { \pgfpathmoveto{ \pgfpointadd {\pgfpoint{-\pgfsnakecompleteddistance}{0pt}}% {\pgfpointpolar{\pgfsnakesegmentangle}{\pgfsnakecompleteddistance}}}% \pgfpatharc{\pgfsnakesegmentangle}{-\pgfsnakesegmentangle}{\pgfsnakecompleteddistance}% } \state{last}[width=0pt,next state=final] { \pgfpathmoveto{ \pgfpointadd {\pgfpoint{-\pgfsnakecompleteddistance}{0pt}}% {\pgfpointpolar{\pgfsnakesegmentangle}{\pgfsnakecompleteddistance}}}% \pgfpatharc{\pgfsnakesegmentangle}{-\pgfsnakesegmentangle}{\pgfsnakecompleteddistance}% } \state{final} { \pgfpathmoveto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % waves snake % % Parameters: \pgfsnakesegmentangle, \pgfsnakesegmentlength \pgfdeclaresnake{waves}{wave} { \state{wave}[width=\pgfsnakesegmentlength] { \pgftransformxshift{\pgfsnakesegmentlength} \pgfpathmoveto{ \pgfpointadd {\pgfpoint{-\pgfsnakesegmentobjectlength}{0pt}}% {\pgfpointpolar{\pgfsnakesegmentangle}{\pgfsnakesegmentobjectlength}}}% \pgfpatharc{\pgfsnakesegmentangle}{-\pgfsnakesegmentangle}{\pgfsnakesegmentobjectlength}% } \state{final} { \pgfpathmoveto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % triangle snakes % % Parameters: \pgfsnakesegmentlength, \pgfsnakeobjectsize, \pgfsnakesegmentamplitude \pgfdeclaresnake{triangles}{triangle} { \state{triangle}[switch if less than=\pgfsnakesegmentlength to last, width=\pgfsnakesegmentlength] { \pgfpathmoveto{\pgfpoint{0pt}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{\pgfsnakesegmentobjectlength}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{-\pgfsnakesegmentamplitude}} \pgfpathclose } \state{last}[width=\pgfsnakesegmentobjectlength,next state=final] { \pgfpathmoveto{\pgfpoint{0pt}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{\pgfsnakesegmentobjectlength}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{-\pgfsnakesegmentamplitude}} \pgfpathclose } \state{final} { \pgfpathmoveto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % crosses snakes % % Parameters: \pgfsnakesegmentlength, \pgfsnakeobjectsize, \pgfsnakesegmentamplitude \pgfdeclaresnake{crosses}{crosses} { \state{crosses}[switch if less than=\pgfsnakesegmentlength to last, width=\pgfsnakesegmentlength] { \pgfpathmoveto{\pgfpoint{0pt}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{\pgfsnakesegmentobjectlength}{-\pgfsnakesegmentamplitude}} \pgfpathmoveto{\pgfpoint{0pt}{-\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{\pgfsnakesegmentobjectlength}{\pgfsnakesegmentamplitude}} } \state{last}[width=\pgfsnakesegmentobjectlength,next state=final] { \pgfpathmoveto{\pgfpoint{0pt}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{\pgfsnakesegmentobjectlength}{-\pgfsnakesegmentamplitude}} \pgfpathmoveto{\pgfpoint{0pt}{-\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{\pgfsnakesegmentobjectlength}{\pgfsnakesegmentamplitude}} } \state{final} { \pgfpathmoveto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % ticks snakes % % Parameters: \pgfsnakesegmentlength, \pgfsnakesegmentamplitude \pgfdeclaresnake{ticks}{ticks} { \state{ticks}[width=\pgfsnakesegmentlength] { \pgfpathmoveto{\pgfpoint{0pt}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{0pt}{-\pgfsnakesegmentamplitude}} } \state{final} { \pgfpathmoveto{\pgfpoint{0pt}{\pgfsnakesegmentamplitude}} \pgfpathlineto{\pgfpoint{0pt}{-\pgfsnakesegmentamplitude}} \pgfpathmoveto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % border snake % % Parameters: \pgfsnakesegmentlength, \pgfsnakesegmentamplitude, \pgfsnakesegmentangle \pgfdeclaresnake{border}{tick} { \state{tick}[switch if less than=\pgfsnakesegmentlength to last, width=\pgfsnakesegmentlength] { \pgfpathmoveto{\pgfpointorigin} \pgfpathlineto{\pgfpointpolar{\pgfsnakesegmentangle}{\pgfsnakesegmentamplitude}} } \state{last}[width=\pgfsnakesegmentamplitude,next state=final] { \pgfpathmoveto{\pgfpointorigin} \pgfpathlineto{\pgfpointpolar{\pgfsnakesegmentangle}{\pgfsnakesegmentamplitude}} } \state{final} { \pgfpathmoveto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } } % brace snakes % % Parameters: \pgfsnakesegmentamplitude \pgfdeclaresnake{brace}{brace} { \state{brace}[width=\pgfsnakeremainingdistance,next state=final] { \pgfpathmoveto{\pgfpoint{0pt}{0pt}} \pgfpathcurveto {\pgfpoint{.15\pgfsnakesegmentamplitude}{.3\pgfsnakesegmentamplitude}} {\pgfpoint{.5\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} {\pgfpoint{\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} { \pgftransformxshift{\pgfsnakesegmentaspect\pgfsnakeremainingdistance} \pgfpathlineto{\pgfpoint{-\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} \pgfpathcurveto {\pgfpoint{-.5\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} {\pgfpoint{-.15\pgfsnakesegmentamplitude}{.7\pgfsnakesegmentamplitude}} {\pgfpoint{0\pgfsnakesegmentamplitude}{1\pgfsnakesegmentamplitude}} \pgfpathcurveto {\pgfpoint{.15\pgfsnakesegmentamplitude}{.7\pgfsnakesegmentamplitude}} {\pgfpoint{.5\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} {\pgfpoint{\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} } { \pgftransformxshift{\pgfsnakeremainingdistance} \pgfpathlineto{\pgfpoint{-\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} \pgfpathcurveto {\pgfpoint{-.5\pgfsnakesegmentamplitude}{.5\pgfsnakesegmentamplitude}} {\pgfpoint{-.15\pgfsnakesegmentamplitude}{.3\pgfsnakesegmentamplitude}} {\pgfpoint{0pt}{0pt}} } } \state{final} {} } % bent snake % % A snake that looks like someone bent the line a bit. % % Parameters: \pgfsnakesegmentamplitude, \pgfsnakesegmentaspect \pgfdeclaresnake{bent}{bent} { \state{bent}[width=\pgfsnakeremainingdistance,next state=final] { \pgfpathcurveto {\pgfpoint{\pgfsnakesegmentaspect\pgfsnakeremainingdistance}{\pgfsnakesegmentamplitude}} {\pgfpointadd{\pgfpoint{\pgfsnakeremainingdistance}{0pt}} {\pgfpoint{-\pgfsnakesegmentaspect\pgfsnakeremainingdistance}{\pgfsnakesegmentamplitude}}} {\pgfpoint{\pgfsnakeremainingdistance}{0pt}} } \state{final} {} } \endinput