10 关于用tikz循环画图的问题

发布于 2021-03-20 18:45:27

阅读数学女孩2的时候,看到用时钟作为例子,其中有一个作图,自己想到了如下代码,但是感觉非常烦琐,哪个可以指点一下,使得更加方便一些?

说明:目标是从12开始,每间隔2个、3个、4个……空,再联起来(其实相当于每间隔1、2、3……个点)。

目前想的办法,
1、用foreach i in {1,2,...,12}node at({-30*i+90}:2cm) {${\i}$};标记数字的位置。
2、foreach i in {1,2,...,12}fill [black] ({-30*i+90}:1.7cm) circle (1pt);画出小点。
3、draw (0,0) circle [radius=1.7cm];画出圆。
4、后面连线时,前几个例子,是为了和foreach i in {1,2,...,12}配合,计算了角度,感觉复杂,最后一个换了一个想法计算位置,感觉依然复杂。

求助:有没有更方便的方法,画完这几个图,并可以画出后面的几个图?希望可以更改一个参数,即间隔,就可以达到目标。

\documentclass{ctexart}
\usepackage{tikz,amsmath}
\usetikzlibrary{arrows.meta,calc,intersections,decorations.pathreplacing,patterns,quotes}
\tikzset{samples=200}
\begin{document}

\begin{tikzpicture}
    \foreach \i in {1,2,...,12}
    \node at({-30*\i+90}:2cm) {${\i}$};
    \foreach \i in {1,2,...,12}
    \fill [black] ({-30*\i+90}:1.7cm) circle (1pt);
    \draw (0,0) circle [radius=1.7cm];
    \draw ({-30*1+60}:1.7cm)--({-30*3+60}:1.7cm)--({-30*5+60}:1.7cm)--({-30*7+60}:1.7cm)--({-30*9+60}:1.7cm)--({-30*11+60}:1.7cm)--cycle;
\end{tikzpicture}
    
\begin{tikzpicture}
    \foreach \i in {1,2,...,12}
    \node at({-30*\i+90}:2cm) {${\i}$};
    \foreach \i in {1,2,...,12}
    \fill [black] ({-30*\i+90}:1.7cm) circle (1pt);
    \draw (0,0) circle [radius=1.7cm];
    \draw ({-30*1+120}:1.7cm)--({-30*4+120}:1.7cm)--({-30*7+120}:1.7cm)--({-30*10+120}:1.7cm)--cycle;
\end{tikzpicture}

\begin{tikzpicture}
    \foreach \i in {1,2,...,12}
    \node at({-30*\i+90}:2cm) {${\i}$};
    \foreach \i in {1,2,...,12}
    \fill [black] ({-30*\i+90}:1.7cm) circle (1pt);
    \draw (0,0) circle [radius=1.7cm];
    \draw ({-30*1+120}:1.7cm)--({-30*5+120}:1.7cm)--({-30*9+120}:1.7cm)--cycle;
\end{tikzpicture}

\begin{tikzpicture}
    \foreach \i in {1,2,...,12}
    \node at({-30*\i+90}:2cm) {${\i}$};
    \foreach \i in {1,2,...,12}
    \fill [black] ({-30*\i+90}:1.7cm) circle (1pt);
    \draw (0,0) circle [radius=1.7cm];
    \draw ({90+150*0}:1.7cm)--({90+150*1}:1.7cm)--({90+150*2}:1.7cm)--({90+150*3}:1.7cm)--({90+150*4}:1.7cm)--({90+150*5}:1.7cm)--({90+150*6}:1.7cm)--({90+150*7}:1.7cm)--({90+150*8}:1.7cm)--({90+150*9}:1.7cm)--({90+150*10}:1.7cm)--({90+150*11}:1.7cm)--cycle;
\end{tikzpicture}

\end{document}

image.png

image.png

image.png

image.png

查看更多

关注者
0
被浏览
2k
2021-03-21
这家伙很懒,什么也没写!
\def\myclock#1{
  \begin{tikzpicture}
    \draw (0,0) circle [radius=2cm];
    \foreach \i in {1,2,...,12}
    \node (\i)[circle,inner sep=0pt,minimum size=5pt,fill,label={90-30*\i:${\i}$}]at({-30*\i+90}:2cm) {};
    \myclocklines{#1}
    \draw \mytemppath;
  \end{tikzpicture}
}
\makeatletter
\def\mytemppath{}
\def\mystopaction.{}
\def\myactionchoice{
  \pgfutil@ifnextchar.\mystopaction\mypathaction
}
\def\myclocklines#1{
  \myactionchoice#1,.
}
\def\mypathaction#1,{
  \ifx\mytemppath\pgfutil@empty
    \def\mytemppath{(#1)}
  \else
    \edef\mytemppath{\mytemppath--(#1)}
  \fi
  \myactionchoice
}
\makeatother

然后使用 \myclock 画图,例如

\myclock{2,4,6,8,10,12,2}

屏幕截图1.png

\myclock{1,6,11,4,9,2,7,12,5,10,3,8,1}

屏幕截图2.png

如果想少码代码就得多费脑筋,想少费脑筋就得多码代码,唉,难以两全。

3 个回答
拿了橘子跑啊
拿了橘子跑啊 2021-03-22
这家伙很懒,什么也没写!

如果你不在乎线段重复绘制的话,代码可以非常简单:

\documentclass{article}
\usepackage{tikz,amsmath}
\newcommand{\Drawclock}[1]{
\begin{tikzpicture}
  \draw (0,0) circle (1.7);
  \foreach \x in {1,2,...,12}
    {\fill (90-30*\x:1.7) circle (1pt);
     \node at (90-30*\x:2.0){\x};
     \draw(90-30*#1*\x-30*#1:1.7)--(90-30*#1*\x:1.7);
    }
\end{tikzpicture}
}
\begin{document}
\foreach \i in {1,2,...,5} {\Drawclock{\i}\;}
\end{document}

效果:
image.png

寄存器
寄存器 2021-03-20
这家伙很懒,什么也没写!

试试tkz-euclide宏包:texdoc tkx-euclide

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览