如何用Latex画下面这个循环箭图?

发布于 2024-12-26 10:34:35

81be5e99ebc6b42e78bf33a6b8efa12.jpg

{
  \documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

    \draw (0,0) circle(2);
    
    
    \foreach \i in {0, 45, 90, 135, 180, 225, 270, 315} {
        \coordinate (A\i) at (\i:2); % 定义点的位置
        \draw[fill] (A\i) circle (2pt); % 画点
    }
    
   \foreach \i in {0, 45, 90, 135, 180, 225, 270, 315} {
        \pgfmathsetmacro{\next}{\i+45}
        \ifnum\next=360 \pgfmathsetmacro{\next}{0} \fi
        \draw[->] (A\i) -- (A\next); 
    }
\end{tikzpicture}

\end{document}
}

这是我的Latex代码

查看更多

关注者
0
被浏览
81
1 个回答
Sagittarius Rover
Sagittarius Rover 13小时前
我要成为TikZ糕手/(ㄒoㄒ)/~~

上面代码报错的原因是缺少int(\i+45)

\documentclass[tikz,border=1cm]{standalone}
\begin{document}
\begin{tikzpicture}
    \draw (0,0) circle(2);
    \foreach \i in {0,45,...,315}{
        \coordinate (A\i) at (\i:2); % 定义点的位置
        \draw[fill] (A\i) circle (2pt); % 画点
    }
    \foreach \i in {0,45,...,315} {
        \pgfmathsetmacro{\next}{int(\i+45)}
        \ifnum \next=360\relax 
            \pgfmathsetmacro{\next}{0} 
        \fi
        \draw[->] (A\i) -- (A\next); 
    }
\end{tikzpicture}
\end{document}

image.png

我很想知道这种图的来源,包括它的所在学科,英文名称以及大致含义。

同时你这个图可拓展性较差,下面的实现也很不优雅,我没有兴趣封装成接口。

另外为了论坛问题的neat,请你删除这一无效问题,想要修改问题可以使用补充问题功能,而不是重新开一个新的问题。

image.png

下面是en画的实现过程...

\documentclass[tikz,border=8pt]{standalone}
\usetikzlibrary{arrows.meta,decorations.markings}
\begin{document}
\begin{tikzpicture}[cap = round]
    % \draw (0,0) circle(2);
    \foreach \i in {30,60,...,150,240,270,300}{
        \node[circle,draw,inner sep=1pt,outer sep=0pt,minimum size=2pt] (A\i) at (\i:2) {}; % 画点
    }
    \foreach \i in {30,60,...,120,240,270} {
        \pgfmathsetmacro{\next}{int(\i+30)}
        \path[->] (A\i) edge[bend right=8] (A\next);
    }
    \foreach \angle/\txt in {30/2,60/1,90/0,120/n-1,150/n-2}{
        \node[label={[anchor=\angle+180,outer sep=1pt,inner sep=1.5pt,]\scriptsize$\txt$}] at (\angle:2) {};
    }
    \foreach \i in {180,210,330,0}{
        \node[circle,inner sep=0pt,outer sep=0pt,minimum size=0pt] (A\i) at (\i:2) {}; % 画点
    }
    \foreach \i in {150,210,300,0} {
        \pgfmathsetmacro{\next}{int(\i+30)}
        \ifnum \next=360 \pgfmathsetmacro{\next}{0} \fi
        \path[->] (A\i) edge[bend right=10] (A\next);
    }
    \path[dotted] (A180) edge[bend right=10] (A210) 
                  (A330) edge[bend right=10] (A0);
\end{tikzpicture}
\end{document}

image.png

其实要想优雅一点,可以用rotate把整个路径划分为:

  • 上半段node
  • 左侧无node虚线段
  • 下半段node
  • 左侧无node虚线段

不过个人觉得意义不是很大。

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览