我想在 Tikz 中绘制这个图形(抱歉图像质量较差):
但是,我不太清楚如何解决这个问题。我所知道的唯一绘制方法如下:
声明一个范围,其中包括沿每条线段中途的箭头,以及
\draw
此范围内部外部的 14 条线段中的每一条。手动处理
\draw
其余行并进行相应的标记。手动绘制
\fill
8 个阴影区域。在两侧添加两个圆弧,并标记其中一个
\gamma
。
当然这不是最有效的方法。使用该calc
包可能会为我节省一些计算,但总体上不会节省太多时间。我想到的另一种方法是定义一个绘制每个未着色三角形的命令,另一个绘制每个着色三角形的命令,但我不确定如何自动放置标签,或者如何在其中声明一个范围newcommand
以使用我的方法获取侧面的箭头。
绘制这样的东西的最佳方法是什么?
答案1
这使用卡拉姆迪尔的解决方案来自如何在线中间画一个箭头?
代码
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\usepackage{xifthen}
\begin{document}
\pgfmathsetmacro{\octagonradius}{3}
\pgfmathsetmacro{\octagonbigradius}{\octagonradius/sin(67.5)}
\begin{tikzpicture}
[ midarrow/.style={thick,decoration={markings,mark=at position 0.5 with {\arrow{>}}},postaction={decorate}}
]
\foreach \x in {1,...,8}
{ \ifthenelse{\isodd{\x}}
{\xdef\mysign{1}}
{\xdef\mysign{-1}}
\fill[red,opacity=0.4,shift={(0,\mysign*\octagonradius)}] (0,0) -- (45*\x+22.5:\octagonbigradius) -- (45*\x+67.5:\octagonbigradius) -- cycle;
\fill[blue,opacity=0.4,shift={(0,\mysign*\octagonradius)}] (0,0) -- (45*\x+22.5:\octagonbigradius) -- (45*\x-22.5:\octagonbigradius) -- cycle;
\draw[shift={(0,\mysign*\octagonradius)}] (0,0) -- node[label=45*\x+112.5:1] {} (45*\x+22.5:\octagonbigradius);
\draw[shift={(0,\mysign*\octagonradius)}] (0,0) -- node[label=45*\x+157.5:0] {} (45*\x+67.5:\octagonbigradius);
}
\foreach \x in {0,...,6}
{ \ifthenelse{\isodd{\x}}
{\xdef\mysign{1}}
{\xdef\mysign{-1}}
\draw[midarrow,shift={(0,\mysign*\octagonradius)}] (45*\x-22.5:\octagonbigradius) -- (45*\x-67.5:\octagonbigradius);
\draw[midarrow,shift={(0,-1*\mysign*\octagonradius)}] (45*\x+112.5:\octagonbigradius) -- (45*\x+157.5:\octagonbigradius);
}
\draw[shift={(0,\octagonradius)}] (247.5:\octagonbigradius) -- (292.5:\octagonbigradius);
\draw[very thick,->] (-\octagonbigradius,\octagonbigradius) to[bend right=40] node[left] {Y} (-\octagonbigradius,-\octagonbigradius);
\draw[very thick,->] (\octagonbigradius,-\octagonbigradius) to[bend right=40] node[right] {Y} (\octagonbigradius,\octagonbigradius);
\end{tikzpicture}
\end{document}
结果
答案2
当你遇到周期性很强的事物时,\foreach
循环就非常令人鼓舞。我在这里展示了一张简单的图片,足以让你开始,但仍然有限,不完整。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}[%
->-/.style={%
postaction={decorate},decoration={%
markings,mark=at position #1 with {\arrow{stealth}}%
}%
},->-/.default=.5,%
-<-/.style={
postaction={decorate},decoration={%
markings,mark=at position #1 with {\arrowreversed{stealth}}%
}%
},-<-/.default=.5]
\foreach \angle [count=\i] in {22.5,67.5,...,337.5} {
\ifodd\i\relax
\draw[-<-] (0,0) -- node{0} (\angle-45:2cm) -- (\angle:2cm) -- cycle;
\else
\fill[->-] (0,0) -- node{1} (\angle-45:2cm) -- (\angle:2cm) -- cycle;
\fi
}
\end{tikzpicture}
\end{document}
我选择使用箭头作为装饰。这样更容易维护和重用代码。样式->-
默认在路径的一半处绘制箭头。并-<-
反向绘制一个箭头。为了在曲线上获得 1 和 0,您需要在路径的一半处使用节点路径。
粗略结果: