노드 사이에 코드가 있는 시계 문자판의 일련의 일러스트레이션을 만들려고 합니다. 12시 위치에서 시작한 다음 12로 돌아갈 때까지 반복적으로 n 위치에 있는 숫자에 코드를 그리고 싶습니다(예: n이 3인 경우 시계 문자판의 코드는 12- 3-6-9-12; n이 5라면 12-5-10-3-8-1-6-11-4-9-2-7-12로 가고 싶습니다.
온라인에서 찾은 다른 코드를 기반으로 다음과 같이 시계를 그립니다.
\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}
나는 이것이 통과할 일련의 노드(예: p12--p5--p10--,...,--p12)를 쉽게 생성할 수 있기를 바랐지만 TikZ를 처음 접하는 사람으로서 이 작업은 다음과 같은 것으로 입증되었습니다. 나를 넘어. 표준 프로그래밍 언어에서는 mod()를 사용하여 배열을 생성할 것 같지만 여기서는 이를 어떻게 수행하는지 잘 모르겠습니다. 이 작업을 수행하는 방법에 대한 제안은 크게 감사하겠습니다.
답변1
아, 타악기가 더 빨랐지만 여기에 Peter Grill의 답변 코드를 사용하는 약간 다른 버전이 있습니다.자동으로 분수를 추가하고 결과를 줄입니다(필요한 경우)12의 최대 공통 분모와 단계 크기를 계산하여 그려야 하는 선 수를 결정하는 데 사용할 수 있습니다. 물론 항상 12개의 선만 그릴 수도 있지만 이로 인해 일부 선이 여러 번 그려지게 됩니다.
\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}
답변2
\foreach
모양을 크게 강조하지 않고 루프 를 추가했습니다 . 또한 실제로 제대로 작동하는지 확인하기 위해 화살촉 등을 추가했으므로 [-latex]
이를 제거하거나 더 보기 좋은 것으로 변경하는 것이 좋습니다.
\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}