Ich versuche, eine Reihe von Abbildungen von Zifferblättern mit Akkorden zwischen den Knoten zu erstellen. Ich möchte bei der 12-Uhr-Position beginnen und dann wiederholt einen Akkord zu der Zahl in n Positionen Entfernung zeichnen, bis ich wieder bei 12 bin (wenn n beispielsweise 3 wäre, hätte ich Akkorde auf dem Zifferblatt, die von 12-3-6-9-12 ausgehen; wenn n 5 wäre, würde ich 12-5-10-3-8-1-6-11-4-9-2-7-12 wollen).
Basierend auf anderem Code, den ich online gefunden habe, zeichne ich die Uhr wie folgt:
\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}
Ich hatte gehofft, dass ich damit ganz einfach eine Reihe von Knoten erstellen könnte, die ich durchlaufen kann (z. B. p12--p5--p10--,...,--p12), aber als Neuling bei TikZ hat sich diese Aufgabe als zu kompliziert für mich erwiesen. In einer Standardprogrammiersprache würde ich vermutlich ein Array mit mod() erstellen, aber ich bin mir nicht sicher, wie ich das hier erreichen soll. Ich wäre für alle Vorschläge, wie ich das machen könnte, sehr dankbar.
Antwort1
Ah, Percussion war schneller, aber hier ist eine etwas andere Version, die den Code aus Peter Grills Antwort aufBrüche automatisch addieren und das Ergebnis kürzen (falls nötig)um den größten gemeinsamen Nenner von 12 und die Schrittweite zu berechnen, mit der wir die Anzahl der zu zeichnenden Linien bestimmen können. Natürlich könnten wir auch einfach 12 Linien zeichnen, aber das führt dazu, dass einige Linien mehrmals gezeichnet werden.
\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}
Antwort2
Ich habe eine Schleife hinzugefügt, \foreach
ohne zu viel Wert auf das Aussehen zu legen. Um zu sehen, ob es wirklich richtig funktioniert, habe ich außerdem Pfeilspitzen [-latex]
usw. hinzugefügt. Sie können diese entfernen oder durch besser aussehende ersetzen.
\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}