Estou tentando criar uma série de ilustrações de mostradores de relógio com acordes entre os nós. Eu gostaria de começar na posição de 12 horas e, em seguida, desenhar um acorde para o número em n posições repetidamente até retornar a 12 (por exemplo, se n fosse 3, eu gostaria de acordes no mostrador do relógio indo de 12- 3-6-9-12; se n fosse 5 eu gostaria de ir 12-5-10-3-8-1-6-11-4-9-2-7-12).
Com base em outro código que encontrei online, estou desenhando o relógio assim:
\newcommand{\TikZMGClockMath}[2]{% Diameter; num. of nodes to skip
\pgfmathsetmacro{\angle}{360/12};%
\draw (0,0) circle (#1);
\foreach \i in {1,...,12} {
\begin{scope}[rotate=-\i * \angle]
\node (p\i) at (0,#1) {$\bullet$};
\node at (0,#1+0.3) {\i};
\end{scope}
}
}
\begin{tikzpicture}
\TikZMGClockMath{3}{3}
\end{tikzpicture}
Eu esperava que isso me permitisse criar facilmente uma série de nós para percorrer (por exemplo, p12--p5--p10--,...,--p12), mas como um novato no TikZ a tarefa provou ser além de mim. Em uma linguagem de programação padrão, acho que criaria um array usando mod(), mas não tenho certeza de como fazer isso aqui. Qualquer sugestão sobre como eu poderia fazer isso seria muito apreciada.
Responder1
Ah, percusse foi mais rápido, mas aqui está uma versão um pouco diferente que usa o código da resposta de Peter Grill paraAdicione frações automaticamente e reduza o resultado (se necessário)para calcular o maior denominador comum de 12 e o tamanho do passo, que pode ser usado para determinar o número de linhas que precisamos desenhar. É claro que poderíamos sempre desenhar apenas 12 linhas, mas isso faz com que algumas linhas sejam desenhadas várias vezes.
\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\makeatletter
\def\gcd#1#2{{% #1 = a, #2 = b
\ifnum#2=0 \edef\next{#1}\else
\@tempcnta=#1 \@tempcntb=#2 \divide\@tempcnta by\@tempcntb
\multiply\@tempcnta by\@tempcntb % q*b
\@tempcntb=#1
\advance\@tempcntb by-\@tempcnta % remainder in \@tempcntb
\ifnum\@tempcntb=0
\@tempcnta=#2
\ifnum\@tempcnta < 0 \@tempcnta=-\@tempcnta\fi
\xdef\gcd@next{\noexpand%
\def\noexpand\thegcd{\the\@tempcnta}}%
\else
\xdef\gcd@next{\noexpand\gcd{#2}{\the\@tempcntb}}%
\fi
\fi}\gcd@next
}
\makeatother
\begin{document}
\newcommand{\TikZMGClockMath}[2]{% Diameter; num. of nodes to skip
\draw (0,0) circle (#1);
\foreach \i in {1,...,12} {
\path (-360/12*\i+90:#1)
node (p\i) [circle,fill,inner sep=2pt] {}
node [anchor=180-360/12*\i+90] {\i};
}
\gcd{12}{#2}
\pgfmathtruncatemacro\steps{12/\thegcd}
\foreach \pos in {1,...,\steps}{
\pgfmathtruncatemacro\start{Mod(#2*(\pos-1)-1,12)+1}
\pgfmathtruncatemacro\end{Mod(#2*(\pos)-1,12)+1}
\draw [thick,red] (p\start) -- (p\end);
}
}
\noindent
\foreach \stepsize in {1,...,12}{%
\begin{tikzpicture}
\TikZMGClockMath{1}{\stepsize}
\end{tikzpicture}
}
\end{document}
Responder2
Eu adicionei um \foreach
loop sem muita ênfase na aparência. Além disso, para ver se está realmente funcionando corretamente, adicionei pontas de seta via [-latex]
etc., então você pode querer removê-las ou alterá-las por outras mais bonitas.
\documentclass{standalone}
\usepackage{tikz}
\newcommand{\TikZMGClockMath}[2]{% Diameter; num. of nodes to skip
\pgfmathsetmacro{\angle}{360/12};%
\draw (0,0) circle (#1);
\foreach \i in {1,...,12} {
\begin{scope}[rotate=-\i * \angle]
\node[inner sep=1pt,fill,circle] (p\i) at (0,#1) {};
\node at (0,#1+0.3) {\i};
\end{scope}
}
\draw[-latex] (p12) -- (p#2);
\foreach \x[remember=\x as \lastx (initially 1)] in {2,...,12}{
\pgfmathtruncatemacro{\modtwelve}{mod(#2*\x,12)}
\pgfmathtruncatemacro{\lastmodtwelve}{mod(#2*\lastx,12)}
\ifnum\modtwelve>0\relax
\draw[latex-] (p\modtwelve) -- (p\lastmodtwelve);
\else
\draw[latex-] (p12) -- (p\lastmodtwelve);
\breakforeach
\fi
}
}
\begin{document}
\begin{tikzpicture}
\TikZMGClockMath{3}{7}
\begin{scope}[xshift=7cm]
\TikZMGClockMath{3}{10}
\end{scope}
\begin{scope}[xshift=14cm]
\TikZMGClockMath{3}{5}
\end{scope}
\begin{scope}[yshift=7cm]
\TikZMGClockMath{3}{3}
\end{scope}
\begin{scope}[shift={(7cm,7cm)}]
\TikZMGClockMath{3}{4}
\end{scope}
\begin{scope}[shift={(14cm,7cm)}]
\TikZMGClockMath{3}{6}
\end{scope}
\end{tikzpicture}
\end{document}