如何在 TikZ 弧上获得正确的箭头方向?

如何在 TikZ 弧上获得正确的箭头方向?

我正在尝试修复以下 TikZ 图形,其中中间的圆形装置应被两个逆时针弯曲的箭头所包围。

箭头方向错误

我画了这些箭头,并附有arc路径,但箭头的尖端意外地都指向上方。有没有什么办法可以让这些箭头尖端跟随弧线的方向?

以下是上图的代码:

\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}

 \draw (0,0) circle (1cm);

 \draw[fill=gray!20]  (23:0.45cm)
    -- (23:1cm) arc[radius=1, start angle=23, end angle=-203] (157:1cm)
    -- (157:0.45cm) arc[radius=0.45, start angle=157, end angle=23] (23:0.45cm);

 \draw[fill] (0,0) circle(2pt);

 \draw[->,>=stealth',semithick] (150:1.2cm) arc[radius=1.2, start angle=150, end angle=210] (210:1.2cm);
 \draw[->,>=stealth',semithick] (-30:1.2cm) arc[radius=1.2, start angle=-30, end angle=30] (30:1.2cm);

 \foreach \x/\y in {1/0,2/0,3/0,4/1,5/1,6/1,7/0,0/1}
    \node[rotate={\x*45-90}] at ($(0,0)!.75!\x*45:(1,0)$) {\y} ;
\end{tikzpicture}
\end{document}

答案1

这是因为您正在添加最终坐标。它们不应该在那里。只需将行更改为:

\draw[->,>=stealth',semithick] (150:1.2cm) arc[radius=1.2, start angle=150, end angle=210];
\draw[->,>=stealth',semithick] (-30:1.2cm) arc[radius=1.2, start angle=-30, end angle=30];

这个问题在更简单的情况下也会出现,它不是曲线所固有的。例如,考虑\draw[->] (0,0) -- (2,0) (2,0);在水平线的末端给出一个向上指向的箭头。基本上,新的坐标开始一个新的路径段,并且只有路径的最后一段被赋予箭头尖端。

答案2

出现问题的原因是,当您使用符号时,路径方向没有使用曲线明确计算arc[radius=1, start angle=23, end angle=-203] (150:210:1.2cm)。这是由于 wh1t3 给出的推理,而是使用更短的符号,这会为您提供正确的路径和箭头:

\draw[->,>=stealth',semithick] (150:1.2cm) arc (150:210:1.2cm);
\draw[->,>=stealth',semithick] (-30:1.2cm) arc (-30:30:1.2cm);

答案3

我同意 wh1t3 的观点,问题出在路径上。灰色的路径也以一种奇怪的方式分隔。这不是语法问题,语法radius=..., start angle=..., end angle=...很好,但较短的语法通常(总是)更受欢迎。另一种语法使用arc [...]like edge[...],并且很容易在括号后跟一个节点(...)

这里的代码更简洁,但这并不意味着一个代码比另一个代码更简洁,它总是最好的。而你的情况,你可以避免\x/\y

\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc}

\begin{document}
\begin{tikzpicture}
  \draw[fill=gray!20](23:0.45cm) arc (23:157:0.45cm) -- (157:1cm) arc(157:383:1cm)--cycle ;
  \draw[->,>=stealth',semithick] (150:1.2cm) arc (150:210:1.2cm);
  \draw[->,>=stealth',semithick] (-30:1.2cm) arc (-30:30:1.2cm);    
  \foreach \y[count=\x from -1] in {0,0,0,1,1,1,0,1} 
       \node[rotate={\x*45}] at (45*\x+90:0.75cm) {\y} ;
  \draw[fill] (0,0) circle(2pt);  
  \draw (0,0) circle (1cm);  
\end{tikzpicture}
\end{document}

相关内容