Pacman circle in TikZ
I think you misinterpret what the in
and out
syntax does. You may want to use arc
.
\documentclass[tikz,border=3.14mm]{standalone}
\tikzset{
Pacman/.pic={
\shadedraw[inner color=yellow,outer color=yellow!80!black,draw=black,thick]
(0,0) -- (40:2) arc(40:320:2) -- cycle;
\fill (0,1) circle (0.3);
}
}
\begin{document}
\begin{tikzpicture}
\pic {Pacman};
\pic[xscale=-1] at (5,0) {Pacman};
\end{tikzpicture}
\end{document}
Anyway, here is a 3D version.
\documentclass[tikz,border=3.14mm]{standalone}
\tikzset{Pacman/.pic={
\fill (0,0) to[out={1.75*#1},in={180-0.25*#1}] ({0.92*#1}:2)
to[out={-180+0.25*#1},in={1.75*#1},looseness=0.5] (1,0)
to[out={-1.75*#1},in={180-0.25*#1},looseness=0.5] ({-0.92*#1}:2)
to [out={-180+0.25*#1},in={-1.75*#1}] cycle;
\shadedraw[ball color=yellow,thick]
(0,0) to[out={1.75*#1},in={180-0.25*#1}] ({0.92*#1}:2)
arc({0.92*#1}:{360-0.92*#1}:2) to [out={-180+0.25*#1},in={-1.75*#1}]
cycle;
\fill ({0.3-0.01*#1},1) circle (0.3);
}
}
\begin{document}
\begin{tikzpicture}
\pic {Pacman=50};
\pic[xscale=-1] at (5,0) {Pacman=20};
\end{tikzpicture}
\end{document}
EDIT: Added backwards facing Pacman and used pic
and added 3D.
2nd EDIT: Inspired by samcarter, who got inspired by caverac: a 3D animation using this answer.
\documentclass{article}
\usepackage{animate}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[active,tightpage]{preview}
\makeatletter
\def\@anim@@newframe{\@ifstar\@anim@newframe\@anim@newframe}
\def\@anim@newframe{\end{preview}\begin{preview}}
\renewenvironment{animateinline}[2][]{%
\let\newframe\@anim@@newframe%
\let\multiframe\@anim@multiframe%
\begin{preview}}{%
\end{preview}}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{tikz}
\usepgfmodule{nonlineartransformations}
\usetikzlibrary{shapes}
\usetikzlibrary{patterns}
\makeatletter
% from https://tex.stackexchange.com/q/56353/121799
\newcommand{\gettikzxy}[3]{%
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\global\edef#2{\the\pgf@x}%
\global\edef#3{\the\pgf@y}%
}
% from the manual section 103.4.2
% \pgf@x will contain the \xout{radius} angle
% \pgf@y will contain the distance \pgfmathsincos@{\pgf@sys@tonumber\pgf@x}%
% pgfmathresultx is now the cosine of \xout{radius} radius and
% pgfmathresulty is the sine of radius
% \pgf@x=\pgfmathresultx\pgf@y%
% \pgf@y=\pgfmathresulty\pgf@y%
% what the thing in the pgf manually is probably doing it to express the x coordinate in pt
% then take the cos and sin of x/pt (i.e. if x=50pt then it will return cos(50))
% and multiply the outcome by a the y coordinate
% (x_new,y_new) = (y_old cos(x_old/pt), y_old sin(x_old/pt))
% now comes a slightly modified version
\def\marmotransformation{% modified version of the manual 103.4.2 Installing Nonlinear Transformation
\advance\pgf@x by -\xC% relative
\advance\pgf@y by -\yC% coorinates
\edef\relX{\the\pgf@x}%
\edef\relY{\the\pgf@y}% Yes, there is a more elegant solution based on \pgfpointadd
\pgfmathsetmacro{\relNx}{\xN-\xC}%
\pgfmathsetmacro{\relNy}{\yN-\yC}%
\pgfmathsetmacro{\angleN}{atan2(\relNy,\relNx)}%
\pgfmathsetmacro{\LeN}{veclen(\relNx,\relNy)}%
\pgfmathsetmacro{\myp}{(\relX*\relNx+\relY*\relNy)/(\LeN*28.3465)}
\pgfmathsetmacro{\myo}{(((\relY*\relNx-\relX*\relNy))/(\myp*\LeN*(28.3465*pi/180)))+\angleN)}
\pgfpointadd{\pgfqpoint{\xC}{\yC}}{\pgfpointpolarxy{\myo}{\myp}}
}
\begin{document}
\begin{animateinline}[autoplay,loop]{2}
\multiframe{21}{i=0+1}{\pgfmathsetmacro{\myangle}{60-5*abs(\i-10)}
\begin{tikzpicture}[ball color=red]
%\pic[scale=2] at (-6.5,0) {Pacman=\myangle};
\begin{scope}[xshift={-(6.5-0.4*\i)*1cm},scale=2]
\fill (0,0) to[out={1.75*\myangle},in={180-0.25*\myangle}] ({0.92*\myangle}:2)
to[out={-180+0.25*\myangle},in={1.75*\myangle},looseness=0.5] (1,0)
to[out={-1.75*\myangle},in={180-0.25*\myangle},looseness=0.5]
({-0.92*\myangle}:2) to [out={-180+0.25*\myangle},in={-1.75*\myangle}] cycle;
\end{scope}
%
\coordinate (C) at (0,3) {};
\gettikzxy{(C)}{\xC}{\yC}
\coordinate (N) at (0,0) {};
\gettikzxy{(N)}{\xN}{\yN}
\begin{scope}[transform shape nonlinear=true]
\pgftransformnonlinear{\marmotransformation}
\shade[shading=ball,opacity=1] (0,0) circle (2);
\end{scope}
\draw[smooth,fill=black](-0.15,3) .. controls (-0.15,2.5) .. (0,2) to
(0.1,2) .. controls (-0.05,2.5) .. (-0.05,3) --cycle;
%
\begin{scope}[xshift={-(6.5-0.4*\i)*1cm},scale=2]
\shadedraw[ball color=yellow,thick]
(0,0) to[out={1.75*\myangle},in={180-0.25*\myangle}] ({0.92*\myangle}:2)
arc({0.92*\myangle}:{360-0.92*\myangle}:2) to [out={-180+0.25*\myangle},in={-1.75*\myangle}]
cycle;
\fill ({0.3-0.01*\myangle},1) circle (0.3);
\end{scope}
\path[use as bounding box](-8,-2) rectangle 4,2);
\end{tikzpicture}
}
\end{animateinline}
\end{document}
\documentclass[border = 5pt, tikz]{standalone}
\usepackage{xcolor-material}
% from https://tex.stackexchange.com/questions/413389/how-to-make-a-simple-drawing-of-an-apple-using-only-the-tikz-library
\usetikzlibrary{fit}
\tikzset{%
apple/.pic={
\fill [MaterialBrown] (-1/8,0)
arc (180:120:1 and 3/2) coordinate [pos=3/5] (@)-- ++(1/6,-1/7)
arc (120:180:5/4 and 3/2) -- cycle;
\fill [MaterialLightGreen500] (0,-9/10)
.. controls ++(180:1/8) and ++( 0:1/4) .. (-1/3, -1)
.. controls ++(180:1/3) and ++(270:1/2) .. ( -1, 0)
.. controls ++( 90:1/3) and ++(180:1/3) .. (-1/2, 3/4)
.. controls ++( 0:1/8) and ++(135:1/8) .. ( 0, 4/7)
.. controls ++( 45:1/8) and ++(180:1/8) .. ( 1/2, 3/4)
.. controls ++( 0:1/3) and ++( 90:1/3) .. ( 1, 0)
.. controls ++(270:1/2) and ++( 0:1/3) .. ( 1/3, -1)
.. controls ++(180:1/4) and ++( 0:1/8) .. cycle;
\fill [MaterialLightGreen600] (0, 4/7)
.. controls ++( 45:1/8) and ++(180:1/8) .. ( 1/2, 3/4)
.. controls ++( 0:1/3) and ++( 90:1/3) .. ( 1, 0)
.. controls ++(270:1/2) and ++( 0:1/3) .. ( 1/3, -1)
.. controls ++(180:1/4) and ++( 0:1/8) .. ( 0,-9/10);
\fill [MaterialGreen500, shift={(@)}, rotate=-30]
(0,0) arc (45:135:3/4 and 3/5) arc (225:315:3/4 and 3/5);
\fill [MaterialGreen700, shift={(@)}, rotate=-30]
(0,0) arc (315:225:3/4 and 3/5) -- cycle;
},
cherry/.pic={
\foreach \i in {1,2}{
\tikzset{shift={(-1+\i*3/4, -3/5+\i/5)},scale=1/2, rotate=15-\i*10}
\fill [MaterialRed700] (0,19/20)
.. controls ++(180:1/8) and ++( 0:1/4) .. (-1/3, 1)
.. controls ++(180:1/3) and ++( 90:1/2) .. ( -1, 0)
.. controls ++(270:1/2) and ++(180:1/2) .. ( 0, -1)
.. controls ++( 0:1/2) and ++(270:1/2) .. ( 1, 0)
.. controls ++( 90:1/2) and ++( 0:1/3) .. ( 1/3, 1)
.. controls ++(180:1/4) and ++( 0:1/8) .. cycle;
\fill [MaterialRed800] (0, -1)
.. controls ++( 0:1/2) and ++(270:1/2) .. ( 1, 0)
.. controls ++( 90:1/2) and ++( 0:1/3) .. ( 1/3, 1)
.. controls ++(180:1/4) and ++( 0:1/8) .. ( 0,19/20) -- cycle;
\fill [MaterialRed900] (0,3/4) coordinate (@\i)
ellipse [x radius=1/4, y radius=1/8];
}
\fill [MaterialBrown]
(1/4,11/8) -- (3/8,11/8) coordinate (@)
.. controls ++(270:1/2) and ++(135:1/3) .. (@1)
.. controls ++(135:1/2) and ++(270:1/2) .. cycle;
\fill [MaterialBrown]
(1/4,11/8) -- (3/8,11/8)
.. controls ++(315:1/2) and ++(45:1/2) .. (@2)
.. controls ++(60:1/2) and ++(315:1/2) .. cycle;
\fill [MaterialGreen500, shift={(@)}, rotate=20]
(0,0) arc (45:135:3/4 and 3/5) arc (225:315:3/4 and 3/5);
\fill [MaterialGreen700, shift={(@)}, rotate=20]
(0,0) arc (315:225:3/4 and 3/5) -- cycle;
}}
\newcount\nframes
\nframes=80
\begin{document}
\foreach \n in {0,...,\nframes}{
\begin{tikzpicture}
\pgfmathsetmacro{\x}{10.0 * \n / \nframes}
\pgfmathsetmacro{\angle}{5 + 25 * abs(sin(3 * 360 * (\n / \nframes)))}
\clip (-1, -1.2) rectangle (10, 1.2);
% food
\begin{scope}
\clip (\x, -1.2) rectangle (10, 1.2);
\foreach \i in {0,...,10} {
\ifnum\i=5 \path (8, 0) pic[scale = 0.4] {apple};
\else \ifnum\i=8 \path (5, 0) pic[scale = 0.4] {cherry};
\else \fill[gray, opacity = 0.3] (\i, 0) circle (0.2);
\fi \fi
}
\end{scope}
% pacman
\begin{scope}[xshift = \x cm]
\draw[thick,fill = yellow]
(0,0) -- ++ (\angle:1cm) arc (\angle:360-\angle:1cm) -- cycle;
\fill (0,0.66) circle (1.5mm);
\end{scope}
\end{tikzpicture}
}
\end{document}
EDIT: Thanks to @UlrikeFischer for the suggestion :)
\newcommand{\interrupted}{%
\pgfmathsetmacro{\dx}{11.0 / 7.0}
\foreach \i/\c in {0/gray,1/yellow,2/cyan,3/green,4/magenta,5/red,6/blue} {
\fill[\c] (\i * \dx - 1, -0.4) rectangle (\i * \dx + \dx - 1, 1.2);
}
\foreach \i/\c in {0/blue,1/black,2/magenta,3/black,4/cyan,5/black,6/white} {
\fill[\c] (\i * \dx - 1, -0.6) rectangle (\i * \dx + \dx - 1, -0.4);
}
\pgfmathsetmacro{\dx}{11.0 / 6.0}
\foreach \i/\c in {0/blue!40!black,1/white,2/blue,3/black,4/black!80,5/black} {
\fill[\c] (\i * \dx - 1, -1.2) rectangle (\i * \dx + \dx - 1, -0.6);
}
\node[white] at (5.5, 0) {\textbf{No ducks were harmed in this test}}
}
And add this to the main loop
\pgfmathsetmacro{\switchl}{\x > 4.0}
\pgfmathsetmacro{\switchr}{\x < 6.0}
\ifnum\switchl=1 \ifnum\switchr=1
\interrupted{};
\fi\fi
A picture version just to impress David Carlisle ;)
\documentclass[border=7pt]{standalone}
\usepackage{color}
\begin{document}
\setlength{\unitlength}{.5pt}
\begin{picture}(200,200)(-100,-100)
\qbezier(0,0)(43.5, 25)(87, 50)
\qbezier(87, 50)(58, 100)(0, 100)
\qbezier(0, 100)(-58, 100)(-87, 50)
\qbezier(-87, 50)(-115, 0)(-87, -50)
\qbezier(-87, -50)(-58, -100)(0, -100)
\qbezier(0, -100)(58, -100)(87, -50)
\qbezier(87, -50)(43.5, -25)(0, 0)
\color{red}
\put(0,67){\circle*{30}}
\end{picture}
\end{document}