TikZ 在网格中绘制变化的矢量场

TikZ 在网格中绘制变化的矢量场

到目前为止,我已经成功地使用网格和节点绘制了一个简单的网格及其中心。

\draw[step=1] (0, 0) grid (4, 3);

\coordinate (a) at (0.4, 0.3);
\coordinate (b) at (3.8, 0.8);

\draw[fill=white,thick,->] (a) -- (b);

\foreach \x in {0.5, 1.5, 2.5, 3.5} {
    \foreach \y in {0.5, 1.5, 2.5} {
        \node at (\x, \y)[circle, fill=black, scale=0.25] {};
    }
}

但是对于表示单元格质心的节点,我还想添加一个矢量场。一列中的矢量应该指向相同的方向,但沿 x 轴,当它们向右移动时,它们应该更多地指向上方(如 Pi/8、Pi/4、3*Pi/4 等)。我很清楚如何在“普通”编程语言中对其进行编程,但我不明白这如何适合 TikZ 的 foreach 循环。

另外,我想知道是否可以使用曲线网格来代替简单的矩形网格。

答案1

放上\usetikzlibrary{calc}序言。然后使用类似

\foreach \x in {0.5, 1.5, 2.5, 3.5} {
    \foreach \y in {0.5, 1.5, 2.5} {
        \node at (\x, \y)[circle, fill=black, scale=0.25] {};
        \pgfmathsetmacro{\vx}{0.2}
        \pgfmathsetmacro{\vy}{\x*0.2}
        \draw[->] (\x,\y) -- (\x+\vx, \y+\vy);
    }
}

\vx根据您想要使用的数学表达式替换和的表达式\vy。如有必要,您还可以使用三角函数或其他标准数学函数。

答案2

pgfplots 可以通过其quiver绘图处理程序绘制矢量场。

在此处输入图片描述

\documentclass[a4paper]{article}

\usepackage{pgfplots}

\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}
\begin{axis}[title=Quiver and plot table]
    \addplot[blue,
        quiver={u=\thisrow{u},v=\thisrow{v}},
        -stealth]
    table
    {
    x y u v
    0 0 1 0
    1 1 1 1
    2 4 1 4
    3 9 1 6
    4 16 1 8
    };
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
    \begin{axis}[
        title={$x \exp(-x^2-y^2)$ and its gradient},
        domain=-2:2,
        view={0}{90},
        axis background/.style={fill=white},
    ]
        \addplot3[contour gnuplot={number=9,
            labels=false},thick]
                {exp(0-x^2-y^2)*x};
        \addplot3[blue,
            quiver={
             u={exp(0-x^2-y^2)*(1-2*x^2)},
             v={exp(0-x^2-y^2)*(-2*x*y)},
             scale arrows=0.3,
            },
            -stealth,samples=15]
                {exp(0-x^2-y^2)*x};
    \end{axis}
\end{tikzpicture}


\end{document}

但是,它仅限于矩形网格、对数坐标或极坐标。

答案3

“同时”迭代变量TikZ的语法如下:变量列表必须用斜杠分隔/,列表项也可以是用斜杠分隔的值列表。

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw (0, 0) grid (4, 3);

\foreach \x/\angle in {0.5/20, 1.5/40, 2.5/60, 3.5/80} {
    \foreach \y in {0.5, 1.5, 2.5} {
        \fill (\x,\y) circle[radius=1pt];
        \draw[->,thick]  (\x, \y) -- ++(\angle:1);
    }
}
\end{tikzpicture}

\end{document}

编辑:这是一个使用弧度表示的角度倍数的修改版本:

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\def\angle{pi/8}
\pgfmathsetmacro{\dang}{deg(\angle)}
\draw (0, 0) grid (4, 3);

\foreach \x/\k in {0.5/1, 1.5/2, 2.5/3, 3.5/4} {
    \foreach \y in {0.5, 1.5, 2.5} {
        \fill (\x,\y) circle[radius=1pt];
        \draw[->,thick]  (\x, \y) -- ++(\k*\dang:1);
    }
}
\end{tikzpicture}

\end{document}

相关内容