% \iffalse % -------------------------------------------------------------------- %<*hex> % \fi % % \subsubsection{Ridges} % \label{sec:impl:hex:ridges} % % A hex can be decorated with up to 6 ridges --- one for each edge of % the hexagon. The first thing is to set up the graphics style to use % for the ridges. We use the \spec{wave} decoration. % % If rounded corners are set for ridges, (e.g., via \spec{every hex % ridges}), then it should be \spec{0pt} or \spec{4pt} (roughly 2mm) % or larger. Otherwise, one will get a ``dimension too large'' % error. % % \begin{macrocode} \tikzset{% hex/ridges pre/.style={ line cap=round, draw=pgfstrokecolor, solid, /hex/ridges/.cd,% radius=0.85,% n=4, R=.25, }, hex/ridges/.style={ get scale, decoration={ path has corners=true, waves, radius=\wg@scale\hex@r@R, segment length=\wg@scale\hex@r@s, }, decorate}} % \end{macrocode} % % To properly set up the ridges, we need to concatenate ridge paths in % order. To facilitate that, we define 6 \cs{if}s --- one for each % edge. % % \begin{macrocode} \newif\ifhex@r@ne \newif\ifhex@r@n \newif\ifhex@r@nw \newif\ifhex@r@sw \newif\ifhex@r@s \newif\ifhex@r@se % \end{macrocode} % % Next is the keys for each edge. These will set the above \cs{if}s % to \spec{true}. We put these into the family \spec{/hex/r} so that % we can parse them separately. % % \begin{macrocode} \tikzset{% /hex/ridges/.search also={/tikz}, /hex/ridges/.cd, north east/.is if=hex@r@ne, north/.is if=hex@r@n, north west/.is if=hex@r@nw, south west/.is if=hex@r@sw, south/.is if=hex@r@s, south east/.is if=hex@r@se, radius/.store in=\hex@r@r, curve radius/.store in=\hex@r@w, NE/.is if=hex@r@ne, N/.is if=hex@r@n, NW/.is if=hex@r@nw, SW/.is if=hex@r@sw, S/.is if=hex@r@s, SE/.is if=hex@r@se, r/.store in=\hex@r@r, n/.store in=\hex@r@n, R/.store in=\hex@r@w, } % \end{macrocode} % % \begin{Macro}{\hex@do@ridges} % % This is the macro that actually generates the ridge. We use the % same \textsc{pgf} filtered key parsing trick as above. Note that % the routine below is handcrafted since it is relatively simple. % % \begin{macrocode} \newdimen\hex@r@s \newdimen\hex@r@R \def\hex@do@ridges{% \edef\hex@r@tmp{[ hex/ridges pre, /tikz/every hex ridges/.try, \hex@ridges]} \expandafter\scope\hex@r@tmp% \hex@dbg{3}{Ridges: `\meaning\hex@ridges', `\meaning\hex@r@tmp' ^^Jnorth east=\ifhex@r@ne yes\else no\fi ^^Jnorth =\ifhex@r@n yes\else no\fi ^^Jnorth west=\ifhex@r@nw yes\else no\fi ^^Jsouth west=\ifhex@r@sw yes\else no\fi ^^Jsouth =\ifhex@r@s yes\else no\fi ^^Jsouth east=\ifhex@r@se yes\else no\fi ^^Jradius =\hex@r@r ^^Jn =\hex@r@n } \pgfmathparse{\hex@r@r/\hex@r@n}\xdef\hex@r@t{\pgfmathresult} \hex@r@s=\hex@r@t cm \hex@r@R=\hex@r@w cm \def\hex@r@p{} % Hand written algorithm \ifhex@r@ne \ifhex@r@se \xdef\hex@r@p{(0:\hex@r@r)--(60:\hex@r@r)} \else \xdef\hex@r@p{($(0:\hex@r@r)+(-60:\hex@r@t/2)$)--(60:\hex@r@r)} \fi \hex@dbg{4}{Ridge along north east edge: `\hex@r@p'} \fi \ifhex@r@n \ifhex@r@ne\else \xdef\hex@r@p{\hex@r@p ($( 60:\hex@r@r)+(0:\hex@r@t/2)$)} \fi \xdef\hex@r@p{\hex@r@p --(120:\hex@r@r)} \hex@dbg{4}{Ridge along north edge: `\hex@r@p'} \fi \ifhex@r@nw \ifhex@r@n\else \xdef\hex@r@p{\hex@r@p ($(120:\hex@r@r)+(60:\hex@r@t/2)$)} \fi \xdef\hex@r@p{\hex@r@p --(180:\hex@r@r)} \hex@dbg{4}{Ridge along north west: `\hex@r@p'} \fi \ifhex@r@sw \ifhex@r@nw\else \xdef\hex@r@p{\hex@r@p ($(180:\hex@r@r)+(120:\hex@r@t/2)$)} \fi \ifhex@r@s \xdef\hex@r@p{\hex@r@p --(240:\hex@r@r)} \else \xdef\hex@r@p{\hex@r@p --(240:\hex@r@r)} \fi \hex@dbg{4}{Ridge along south west: `\hex@r@p'} \fi \ifhex@r@s \ifhex@r@sw\else \xdef\hex@r@p{\hex@r@p ($(240:\hex@r@r)+(-\hex@r@t/2,0)$)} \fi \ifhex@r@se \xdef\hex@r@p{\hex@r@p --(300:\hex@r@r)} \else \xdef\hex@r@p{\hex@r@p --(300.5:\hex@r@r)} \fi \hex@dbg{4}{Ridge along south: `\hex@r@p'} \fi \ifhex@r@se \ifhex@r@s\else \xdef\hex@r@p{\hex@r@p ($(300:\hex@r@r)+(-120:\hex@r@t/2)$)} \fi \ifhex@r@ne %\xdef\hex@r@p{\hex@r@p --cycle} \xdef\hex@r@p{\hex@r@p -- (0:\hex@r@r)} \else \xdef\hex@r@p{\hex@r@p --(.5:\hex@r@r)} \fi \hex@dbg{4}{Ridge along south east: `\hex@r@p'} \fi \hex@dbg{3}{ Ridges path: \hex@r@p} % \draw[red] \hex@r@p; \draw[hex/ridges] \hex@r@p; \endscope% End of ridges scope } % \end{macrocode} % \end{Macro} % % \iffalse % % -------------------------------------------------------------------- % \fi