19

I'm trying to draw a sleeping duck, using the extremely cool tikzducks.sty. And I encounter two problems. To explain them, let me present the MWE first.

\documentclass{standalone}
\usepackage{tikzducks}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}[scale=9] % changing the scale to 1 (or even somewhat larger values) fails
 \duck[eye=yellow!50!brown,pupil=yellow!50!brown]
        \begin{scope}[ultra thick,rotate=-20,decoration={ticks,raise=-4,amplitude=4,segment length=8
        }]
        \draw[decorate] (0.161,1.682) arc [start angle=220, end angle=320,x radius=0.0893, y radius=0.125];
%       \draw[decorate] (0.23,1.7675) ellipse (0.0893 and 0.125); %from tikzducks.sty
        \draw[decorate] (-0.06,1.74) ellipse (0.0786 and 0.1143); %from tikzducks.sty
%       \draw[decorate] (-0.125,1.67) arc [start angle=220, end angle=320,x radius=0.0893, y radius=0.125];
        \end{scope}
\end{tikzpicture}
\end{document}

enter image description here

The right eye (OK, the duck would say it's her left eye) is roughly as I want it to be. However, I had to move the center of the ellipse whose arc I was drawing relative to the values found in tikzducks.sty. On the left I I drew the complete ellipse, and no adjustment of the coordinates was necessary. (Of course, ultimately I'd like only a arc here, too.) So my first question is whether one can draw an elliptical arc sitting on the ellipse without adjusting this coordinate.

What is more, if I downscale the picture, i.e. remove the [scale=9] after begin{tikzpicture}, the compilation fails with a ! Dimension too large. error. Is there a way to fix this? (Or do the ducks have to stay awake all the time? ;-)

12
  • 2
    An ellipse is drawn with the pen (coordinate before ellipse, (0.23,1.7675) in this case) initially located on its center. While an arc is drawn with the pen located on the starting point, which in this case should be over the ellipse.
    – Ignasi
    Jan 8 '18 at 17:04
  • @Ignasi Thanks, I am aware of this. (Perhaps I should have written this.) My question is whether one can only draw a part of an ellipse with the placement coinciding with the one of the full ellipse -- the above is an example for a situation where this could be useful.
    – user121799
    Jan 8 '18 at 17:11
  • 4
    Personally, I would let sleeping ducks lie.
    – Alan Munn
    Jan 8 '18 at 18:22
  • 1
    ooh a duck-friendly marmot! ♥ Jan 8 '18 at 21:50
  • 1
    @PauloCereda Well, if there is one thing marmots are good at (apart from eating, of course), it's sleeping ;-)
    – user121799
    Jan 8 '18 at 21:59
23

I wouldn't use decorate. You run into problems at different scales, also you can't really fine tune the length. I would draw the eyelashes one by one, and perhaps even bend some. As the line width doesn't scale, some style to adapt the lashes will be needed. A sleeping mask is perhaps easier ;-).

\documentclass{article}
\usepackage{tikzducks}

\begin{document}

\begin{tikzpicture}[scale=1] 
\duck

\path[rotate=-20]
    (0.23,1.7675)coordinate(ECR) ellipse (0.0893 and 0.125);

\path[rotate=-20]
    (-0.06,1.74)coordinate(ECL) ellipse (0.0786 and 0.1143);

\foreach \x/\y in {0/1,1/2,2/3,3/3.3,4/3,5/2,6/1.4}
{ \draw[brown!50!black,rotate=-20,line cap=round] (ECR)--++(\x*15+220:0.11cm+\y*0.012cm); };

\foreach \x/\y in {0/1,1/2,2/3,3/3.3,4/3,5/2,6/1.4}
{ \draw[brown!50!black,rotate=-20,line cap=round] (ECL)--++(\x*15+220:0.11cm+\y*0.009cm); };
%
%
\fill[rotate=-20,yellow!50!brown]
    (0.23,1.7675) ellipse (0.0893 and 0.125);
%
\fill[rotate=-20,yellow!50!brown]
    (-0.06,1.74) ellipse (0.0786 and 0.1143);

\end{tikzpicture}

\begin{tikzpicture}[scale=5] % changing the scale to 1 (or even somewhat larger values) fails
\duck

\path[rotate=-20]
    (0.23,1.7675)coordinate(ECR) ellipse (0.0893 and 0.125);

\path[rotate=-20]
    (-0.06,1.74)coordinate(ECL) ellipse (0.0786 and 0.1143);

\begin{scope}[ultra thick]
\foreach \x/\y in {0/1,1/2,2/3,3/3.3,4/3,5/2,6/1.4}
{ \draw[brown!50!black,rotate=-20,line cap=round] (ECR)--++(\x*15+220:0.11cm+\y*0.012cm); };

\foreach \x/\y in {0/1,1/2,2/3,3/3.3,4/3,5/2,6/1.4}
{ \draw[brown!50!black,rotate=-20,line cap=round] (ECL)--++(\x*15+220:0.11cm+\y*0.009cm); };
\end{scope}
%
%
\fill[rotate=-20,yellow!50!brown]
    (0.23,1.7675) ellipse (0.0893 and 0.125);
%
\fill[rotate=-20,yellow!50!brown]
    (-0.06,1.74) ellipse (0.0786 and 0.1143);

\end{tikzpicture}
\end{document}

enter image description here

9
  • Please feel free to undo my edit. Due to perspective the left eye is a bit smaller. Jan 8 '18 at 17:44
  • @samcarter no its fine, that was a copy&paste error. Jan 8 '18 at 17:45
  • Very nice! Sleep well!
    – user121799
    Jan 8 '18 at 21:21
  • 3
    Some birds have little hairlike feathers being what amounts to eyelashes; there's a very clear example here; secretary birds have prominent ones also; and you can sometimes see teeny ones on a budgie as here; I don't think ducks will in general though. But this is a cartoon duck and it can have lashes if it wants.
    – Glen_b
    Jan 9 '18 at 6:03
  • 1
    @cfr Those who grow beards do ;-)
    – user121799
    Jan 9 '18 at 21:36
5

A solution with an updated version of veclen. I used xfp. The problem is the same with my macro \tkzMarkAngle. I used the library decoration and an error appeared with small angle's value.

\documentclass{standalone}
\usepackage{tikzducks,xfp}
\usetikzlibrary{decorations.pathreplacing}
\makeatletter
\let\pgfmath@function@veclen\relax
\pgfmathdeclarefunction*{veclen}{2}{%
\begingroup%
    \pgfmath@x#1pt\relax%
    \pgfmath@y#2pt\relax%
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \edef\tkz@temp@a{\fpeval{\pgfmath@tonumber{\pgf@xa}}}
    \edef\tkz@temp@b{\fpeval{\pgfmath@tonumber{\pgf@ya}}}
    \edef\tkz@temp@sum{\fpeval{%
        (\tkz@temp@a*\tkz@temp@a+\tkz@temp@b*\tkz@temp@b)}}
    \edef\tkz@xfpMathLen{\fpeval{sqrt(\tkz@temp@sum)}}
%\edef\pgfmath@tmp{\fpeval{round(\tkzFPMathLen,6)}}
%\pgfmath@tmp %
    \pgfmath@returnone\tkz@xfpMathLen pt%
\endgroup%
}
\makeatother
\begin{document}
\begin{tikzpicture}[scale=1] % changing the scale to 1 (or even somewhat larger values) fails
 \duck[eye=yellow!50!brown,pupil=yellow!50!brown]
        \begin{scope}[line width=.4pt,rotate=-20,decoration={ticks,raise=-.5,amplitude=.5,segment length=1.5
        }]
        \draw[decorate] (0.161,1.682) arc [start angle=220, end angle=320,x radius=0.0893, y radius=0.125];
       \draw[decorate] (-0.125,1.67) arc [start angle=220, end angle=320,x radius=0.0893, y radius=0.125];
        \end{scope}
\end{tikzpicture}
\end{document}

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy