![如何在 TikZ 弧上获得正确的箭头方向?](https://linux22.com/image/243642/%E5%A6%82%E4%BD%95%E5%9C%A8%20TikZ%20%E5%BC%A7%E4%B8%8A%E8%8E%B7%E5%BE%97%E6%AD%A3%E7%A1%AE%E7%9A%84%E7%AE%AD%E5%A4%B4%E6%96%B9%E5%90%91%EF%BC%9F.png)
我正在尝试修复以下 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}