阅读数学女孩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}
\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}
是
而
\myclock{1,6,11,4,9,2,7,12,5,10,3,8,1}
是
如果想少码代码就得多费脑筋,想少费脑筋就得多码代码,唉,难以两全。
如果你不在乎线段重复绘制的话,代码可以非常简单:
\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}
效果:
你的代码看起来复杂一些,我还得学习一下,我感觉最大的好处,是做了灵活的拓展,可以指定点进行连接,非常自由。另外一个回答也相当好,简洁。但这次,采纳你的答案吧。
@u934
可能是命令
\myclocklines
的定义复杂一些,还可以更简单点这样
等效于
不过,我要是画那些钟表图的话,我倾向于使用笨办法,写的代码虽然多一些,但也多不了很多,而且一看就明白,便于日后修改。
@u934
如果这样改
那么
等效于