Example: Parameterised pig

Published 2010-04-18 | Author: Marc van Dongen

Download as: [PDF] [TEX]  •  [Open in writeLaTeX]

Parameterised pig

Do you have a question regarding this example, TikZ or LaTeX in general? Just ask in the LaTeX Forum.
Oder frag auf Deutsch auf TeXwelt.de.

% Author M.R.C. van Dongen
% Draw parameterised pig.
% This code can/should be improved by using the pgfkey library.

\documentclass{minimal}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{keyval}

\makeatletter

% We're not using pgfkeys, and we've chosen to use keyval
% for option parsing. The following define the keys for a
% pig keyval family. The main purpose of the keys and
% default values is that we want to be able to draw pigs
% with predefined colours for certain parts and predefined
% scaling factors for line thickness.

\def\pig@draw@thick@width{0.85}
\def\pig@draw@thin@width{0.20}
\def\pig@label{pig label}
\tikzset{draw thick/.style={draw=black,line width=0.85}}
\tikzset{draw thin/.style={draw=black,line width=0.20}}
\tikzset{fill colour/.style={fill=pink}}
\tikzset{nose hole fill colour/.style={fill=purple!50!gray}}
\tikzset{eye fill colour/.style={fill=white}}
\tikzset{pupil fill colour/.style={fill=black}}

\define@key{pig}{draw thick}{\def\draw@pig@thick@width{#1}}
\define@key{pig}{draw thin}{\def\draw@pig@thin@width{#1}}
\define@key{pig}{fill colour}{\tikzset{fill colour/.style={fill=#1}}}
\define@key{pig}{nose hole fill colour}{\tikzset{nose hole fill colour/.style={fill=#1}}}
\define@key{pig}{eye fill colour}{\tikzset{eye fill colour/.style={fill=#1}}}
\define@key{pig}{pupil fill colour}{\tikzset{pupil fill colour/.style={fill=#1}}}
\define@key{pig}{pig label}{\def\pig@label{#1}}
\def\pig@scale{1}

\def\pig{\@ifnextchar[\draw@pig{\draw@pig[]}}
\def\draw@pig[#1]#2{%
   % Set the relative line width for thick lines.
   \def\draw@pig@thick@width{0.85}
   % Set the relative line width for thin lines.
   \def\draw@pig@thin@width{0.20}
   % Set the relative scale of the pig.
   \def\pig@scale{#2}
   \setkeys{pig}{#1}
   \begin{tikzpicture}[scale=#2,
                       draw thick/.style={draw=black,line width=\draw@pig@thick@width*\pig@scale},
                       draw thin/.style={draw=black,line width=\draw@pig@thin@width*\pig@scale}]
   \path (0,0)            coordinate (\pig@label head)
         + (-0.005,-0.20) coordinate (\pig@label nose)
         + (-0.010,+0.05) coordinate (\pig@label body)
         + (-0.010,+0.45) coordinate (\pig@label tail);
   % Define points for tail.
   \foreach \number/\point in {1/{+0.000,+0.055},%
                               2/{-0.058,+0.075},%
                               3/{+0.044,+0.094},%
                               4/{-0.072,+0.137},%
                               5/{+0.048,+0.170},%
                               6/{-0.078,+0.206}} {
       \path (\pig@label tail) +(\point) coordinate (tail \number);
   }
   % Define points for ears and legs.
   \foreach \offset in {-1,1} {
       \path (\pig@label head)
                    ++ (+0.12*\offset,+0.00) coordinate (ear pt 1 \offset)
                    +  (-0.04*\offset,+0.07) coordinate (ear pt 2 \offset)
                    +  (-0.02*\offset,+0.25) coordinate (ear pt 3 \offset)
                    +  (+0.11*\offset,+0.25) coordinate (ear pt 4 \offset)
                    +  (+0.14*\offset,+0.13) coordinate (ear pt 5 \offset)
                    +  (+0.09*\offset,-0.06) coordinate (ear pt 6 \offset)
             (\pig@label head)
                    ++ (+0.09*\offset,-0.30) coordinate (leg 1 \offset)
                    ++ (+0.01*\offset,-0.24) coordinate (leg 2 \offset)
                    ++ (+0.04*\offset,+0.08) coordinate (leg 3 \offset)
                    ++ (+0.04*\offset,-0.08) coordinate (leg 4 \offset)
                    ++ (+0.02*\offset,+0.30) coordinate (leg 5 \offset);
   }
   % draw legs.
   \foreach \number in {-1,1} {
      \filldraw[fill colour,draw thick]
         (leg 1 \number) --
         (leg 2 \number) --
         (leg 3 \number) --
         (leg 4 \number) --
         (leg 5 \number) -- cycle;
   }
   % draw tail.
   \draw[draw thick,line join=round,line cap=round]
         (\pig@label tail) \foreach \num in {1,...,6} { -- (tail \num)};
   % draw body.
   \draw[fill colour,draw thick]
         (\pig@label body) ellipse (4.50mm and 4.10mm);
   % draw ears.
   \foreach \number in {-1,1} {
      % ears
      \filldraw[fill colour,draw thick]
         (ear pt 1 \number) .. controls
         (ear pt 2 \number) and
         (ear pt 3 \number) ..
         (ear pt 4 \number) .. controls
         (ear pt 5 \number) and
         (ear pt 6 \number) .. (ear pt 1 \number);
   }
   % draw nose.
   \filldraw[fill colour,draw thick]
         (\pig@label head) ellipse (1.42mm and 1.40mm);
   \foreach \offset in {-1,1} {
       \filldraw[draw thin,eye fill colour]
                (\pig@label head) ++ (-0.006,0.00) ++ (0.055*\offset,+0.03)
                coordinate (eye \offset)
                ellipse (0.04 and 0.060);
       \fill[pupil fill colour]
            (eye \offset) ellipse (0.020 and 0.035);
   }
   \filldraw[fill colour,draw thick]
         (\pig@label nose) ellipse (2.60mm and 1.72mm);
   % Draw nose holes
   \foreach \offset in {-1,1} {
       \filldraw[draw thick,nose hole fill colour]
                (\pig@label nose) ++ (\offset*0.080,0)
                 ellipse (0.50mm and 0.85mm);
   }
   \end{tikzpicture}
}

\makeatother

\begin{document}
\begin{tikzpicture}
   \draw (0,0) node[anchor=south]{\pig{3}}
         (4,0) node[anchor=south]{\pig[nose hole fill colour=purple!20,fill colour=blue!40]{5}};
\end{tikzpicture}
\end{document}

Comments

  • #1 anonymous, April 23, 2010 at 3:06 a.m.

    That's a nice pig Doc.

Adding comments is currently not enabled.