Хорды ​​между узлами на циферблате с использованием TikZ

Хорды ​​между узлами на циферблате с использованием TikZ

Я пытаюсь создать серию иллюстраций циферблатов с хордами, проходящими между узлами. Я хотел бы начать с позиции 12 часов, затем провести хорду к числу на n позиций дальше, пока не вернусь к 12 (например, если бы 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

Ах, ударные были быстрее, но вот немного другая версия, которая использует код из ответа Питера Грилла наАвтоматически складывать дроби и сокращать результат (при необходимости)для вычисления наибольшего общего знаменателя 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}

введите описание изображения здесь

Связанный контент