在 Tikz 中绘制复杂图形

在 Tikz 中绘制复杂图形

我想在 Tikz 中绘制这个图形(抱歉图像质量较差):

在此处输入图片描述

但是,我不太清楚如何解决这个问题。我所知道的唯一绘制方法如下:

  1. 声明一个范围,其中包括沿每条线段中途的箭头,以及\draw此范围内部外部的 14 条线段中的每一条。

  2. 手动处理\draw其余行并进行相应的标记。

  3. 手动绘制\fill8 个阴影区域。

  4. 在两侧添加两个圆弧,并标记其中一个\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,您需要在路径的一半处使用节点路径。

粗略结果:

在此处输入图片描述

相关内容