Acordes entre nodos en un diagrama tipo reloj usando TikZ

Acordes entre nodos en un diagrama tipo reloj usando TikZ

Estoy intentando crear una serie de ilustraciones de esferas de reloj con cuerdas entre nodos. Me gustaría comenzar en la posición de las 12 en punto, luego dibujar un acorde hasta el número en n posiciones de distancia repetidamente hasta regresar al 12 (por ejemplo, si n fuera 3, me gustaría que los acordes en la esfera del reloj vayan del 12 al 3-6-9-12; si n fuera 5, me gustaría ir 12-5-10-3-8-1-6-11-4-9-2-7-12).

Basado en otro código que encontré en línea, estoy dibujando el reloj así:

\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}

Esperaba que esto me permitiera crear fácilmente una serie de nodos para atravesar (por ejemplo, p12--p5--p10--,...,--p12), pero como recién llegado a TikZ, la tarea ha demostrado ser mas alla de mi. En un lenguaje de programación estándar, supongo que crearía una matriz usando mod(), pero no estoy seguro de cómo lograrlo aquí. Cualquier sugerencia sobre cómo podría hacer esto sería muy apreciada.

Respuesta1

Ah, la percusión fue más rápida, pero aquí hay una versión ligeramente diferente que usa el código de la respuesta de Peter Grill aSuma fracciones automáticamente y reduce el resultado (si es necesario)para calcular el máximo común denominador de 12 y el tamaño del paso, que puede usarse para determinar la cantidad de líneas que necesitamos dibujar. Por supuesto, siempre podemos dibujar 12 líneas, pero eso lleva a que algunas líneas se dibujen varias veces.

\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}

Respuesta2

He añadido un \foreachbucle sin demasiado énfasis en el aspecto. Además, para ver si realmente funciona correctamente, agregué puntas de flecha, [-latex]etc., por lo que es posible que desees eliminarlas o cambiarlas por otras más atractivas.

\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}

ingrese la descripción de la imagen aquí

información relacionada