到目前为止,我已经成功地使用网格和节点绘制了一个简单的网格及其中心。
\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}