7

I would like a better approach to drawing something approximating a hand-draw circle using tikz:

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}

  \coordinate (A) at (0,0);
  \coordinate (C) at (2in, 0);
  \coordinate (B) at ($(C)!1in!-90:(A)$);

  \draw (A) -- (C) -- (B) -- cycle;

  \coordinate (A/u) at ($(A) + (30:1em)$);
  \coordinate (A/d) at ($(A) + (-10:1em)$);
  \coordinate (A/x) at ($(A) + (120:2em)$);
  \coordinate (A/y) at ($(A) + (-120:2em)$);

  \draw[line width=1pt] (A/d) .. controls (A/x) and (A/y) .. (A/u);

\end{tikzpicture}

\end{document}

enter image description here

I am aware of Simulating hand-drawn lines. Though the wobbly effect would be nice, I'd like something approximating my circle where the ends don't quite meet.

A.Ellett
  • 50,533

3 Answers3

10

I don't know how to drive tikz, so please forgive if the syntax is irregular. But what I did was to take a \mathcal{O} and stretch and rotate it in user-definable ways:

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\handoh[3][0]{%
\scalebox{#2}[#3]{\raisebox{1pt}{\kern3pt\rotatebox{#1}{%
  \kern-4.5pt\raisebox{-2pt}{$\mathcal{O}$}\kern-4pt}}\kern2pt}%
}
\begin{document}
\begin{tikzpicture}

  \coordinate (A) at (0,0);
  \coordinate (C) at (2in, 0);
  \coordinate (B) at ($(C)!1in!-90:(A)$);

  \draw (A) -- (C) -- (B) -- cycle;

  \coordinate (A/u) at ($(A) + (30:1em)$);
  \coordinate (A/d) at ($(A) + (-10:1em)$);
  \coordinate (A/x) at ($(A) + (120:2em)$);
  \coordinate (A/y) at ($(A) + (-120:2em)$);


\node (D) [label=left:{\textbackslash handoh[160]\{2.5\}\{3\}}] 
  at (A) {\handoh[160]{2.5}{3}};

\node (E) [label=left:{\textbackslash handoh[45]\{1.3\}\{1.7\}}] 
  at (B) {\handoh[45]{1.3}{1.7}};

\node (F) [label=below:{\textbackslash handoh[-70]\{2.5\}\{1.5\}}] 
  at (C) {\handoh[-70]{2.5}{1.5}};
\end{tikzpicture}
\end{document}

enter image description here

4

It is hard to get the real circular shape you want without another midpoint on the opposite side of the circle. This MWE adds the other midpoint and adjusts the control points a bit to have a somewhat circular, somewhat irregular shape.

In truth, though the "wobbly" effect is nice for straighter line segments, most of the time I find that small circles are pretty smooth lines, just often oblong...

MWE:

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}

  \coordinate (A) at (0,0);
  \coordinate (C) at (2in, 0);
  \coordinate (B) at ($(C)!1in!-90:(A)$);

  \draw (A) -- (C) -- (B) -- cycle;

  \coordinate (A/u) at ($(A) + (40:.8em)$);
  \coordinate (A/d) at ($(A) + (-20:1.1em)$);
  \coordinate (A/l) at ($(A) + (180:.7em)$);
  \coordinate (A/x) at ($(A) + (50:1em)$);
  \coordinate (A/y) at ($(A) + (120:1.2em)$);
  \coordinate (A/v) at ($(A) + (-120:1.6em)$);
  \coordinate (A/w) at ($(A) + (-30:1.8em)$);

  \draw[line width=1pt] (A/d) .. controls (A/x) and (A/y) .. (A/l) .. controls (A/v) and (A/w) .. (A/u);

\end{tikzpicture}

\end{document}

Gives:

circle triangle

cslstr
  • 6,545
4

With the help of Simulating hand-drawn lines, it seems that one gets better results (red lines) for this particular application using a square shape with percusse's decoration=penciline, and circles are better with Alain Matthes's \freedraw:

enter image description here

Code:

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathmorphing,patterns,shapes}

%% https://tex.stackexchange.com/questions/39296/simulating-hand-drawn-lines: percusse \pgfdeclaredecoration{penciline}{initial}{ \state{initial}[width=+\pgfdecoratedinputsegmentremainingdistance,auto corner on length=1mm,]{ \pgfpathcurveto% {% From \pgfqpoint{\pgfdecoratedinputsegmentremainingdistance} {\pgfdecorationsegmentamplitude} } {% Control 1 \pgfmathrand \pgfpointadd{\pgfqpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}} {\pgfqpoint{-\pgfdecorationsegmentaspect\pgfdecoratedinputsegmentremainingdistance}% {\pgfmathresult\pgfdecorationsegmentamplitude} } } {%TO \pgfpointadd{\pgfpointdecoratedinputsegmentlast}{\pgfpoint{0.5pt}{1.5pt}} } } \state{final}{} }

%% https://tex.stackexchange.com/questions/39296/simulating-hand-drawn-lines: Alain Matthes \pgfdeclaredecoration{free hand}{start} { \state{start}[width = +0pt, next state=step, persistent precomputation = \pgfdecoratepathhascornerstrue]{} \state{step}[auto end on length = 3pt, auto corner on length = 3pt,
width=+2pt] { \pgfpathlineto{ \pgfpointadd {\pgfpoint{2pt}{0pt}} {\pgfpoint{rand0.15pt}{rand0.15pt}} } } \state{final} {} } \tikzset{free hand/.style={ decorate, decoration={free hand} } } \def\freedraw#1;{\draw[free hand] #1;}

\begin{document}

\begin{tikzpicture} \coordinate (A) at (0,0); \coordinate (C) at (1in, 0); \coordinate (B) at ($(C)!1in!-90:(A)$);

\draw (A) -- (C) -- (B) -- cycle;

\coordinate (A/u) at ($(A) + (30:1em)$);
\coordinate (A/d) at ($(A) + (-10:1em)$);
\coordinate (A/x) at ($(A) + (120:2em)$);
\coordinate (A/y) at ($(A) + (-120:2em)$);

\begin{scope}[decoration=penciline]
    \draw[thick, fill=blue!25, fill opacity=.25, draw=red, decorate] ($(A)+(-0.1cm,-0.1cm)$)  rectangle (0.1cm,0.2cm); 
    \draw[thick, draw=brown, radius=0.1cm, decorate] (B)  circle (0.15cm); 
    \draw[thick, draw=blue, x radius=0.15cm, y radius=0.19cm, rotate=30, shape=circle, decorate,] (C) circle {}; 
    \node [above left] at (B) {decoration=penciline};
\end{scope}

\end{tikzpicture} \hspace*{0.3cm} \begin{tikzpicture} \coordinate (A) at (0,0); \coordinate (C) at (1in, 0); \coordinate (B) at ($(C)!1in!-90:(A)$);

\draw (A) -- (C) -- (B) -- cycle;

\coordinate (A/u) at ($(A) + (30:1em)$);
\coordinate (A/d) at ($(A) + (-10:1em)$);
\coordinate (A/x) at ($(A) + (120:2em)$);
\coordinate (A/y) at ($(A) + (-120:2em)$);

\freedraw[thick, draw=blue] ($(A)+(-0.1cm,-0.1cm)$)  rectangle (0.15cm,0.2cm); 
\freedraw[thick, fill=blue!25, fill opacity=.25, draw=red] (B) circle [radius=0.2cm]; 
\freedraw[thick, fill=blue!25, fill opacity=.25, draw=red, x radius=0.15cm, y radius=0.19cm, rotate=30, shape=circle,] (C) circle {}; 
\node [above left] at (B) {\textbackslash freedraw};

\end{tikzpicture}

\end{document}

Peter Grill
  • 223,288
  • It's my fault. I made some progress on curves but never quite finished it. As it is the curves are handled by their start/end points hence became straight curvers as you noticed. I should get it working apparently. You can get the xkcd guy head from the other known answer ;) – percusse Mar 19 '14 at 09:33