v = (-x, 2x+y-1)
考虑位于 (0,1)、(1,0) 和 (0,0) 处的三角形上的缩放矢量场:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0,0);
\coordinate (B) at (1,0);
\coordinate (C) at (0,1);
\draw[thick] ($(A)$) -- ($(B)$) -- ($(C)$)-- cycle;
\foreach \x in {1, 2, ..., 10}
\foreach \y in {0, 1, ..., \x}
{\draw [-stealth,blue] ($(B)-(0.1,0)+0.1*(1-\x,\y)$)
-- ++(0.02*\x - 0.2, -0.04*\x + 0.4 +0.02*\y-0.2);}
\end{tikzpicture}
\end{document}
输出如下:
与 MATLAB 绘制的矢量场进行比较quiver
:
MATLAB 的quiver
命令会根据矢量的大小自动缩放箭头的大小。
所以我的问题是:我们如何缩放箭头的大小TikZ
?最好在 MATLAB 的解决方案中,矢量场在 处消失,(0,1)
因此那里没有箭头。
例如,我谷歌了一下,想知道是否pgfmath
可以对长度变量进行一些计算\l
。然后执行以下操作即可:
\draw [-stealth,blue, single arrow head extend=\l mm] ($(B)-(0.1,0)+0.1*(1-\x,\y)$)
-- ++(0.02*\x - 0.2, -0.04*\x + 0.4 +0.02*\y-0.2);
谢谢。
答案1
您可以将 PGFPlots 的quiver
功能与一些坐标过滤结合使用来实现这一点:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
view={0}{90},
axis equal image,
hide axis, clip=false
]
\addplot3 [
blue,
point meta={sqrt(x^2+(2*x+y-1)^2)},
quiver={
u={-x}, v={2*x+y-1},
scale arrows=0.1,
every arrow/.append style={
line width=2pt*\pgfplotspointmetatransformed/1000,
-latex
},
},
samples=10,
domain=0:1, y domain=0:1,
y filter/.append code={\pgfmathparse{(x+y)>1 ? nan : y}},
x filter/.append code={\pgfmathparse{(sqrt(x^2+(2*x+y-1)^2))==0 ? nan : x}}
] (x,y,0);
\draw (axis cs:0,0) -- (axis cs:1,0) -- (axis cs:0,1) -- cycle;
\end{axis}
\end{tikzpicture}
\end{document}
答案2
根据 Qrrbrbirlbel 的评论,除了 Jake 提供的出色答案外,我还想出了自己的解决方案quiver
。我在 Luigi 提出的这个问题中使用了New arrows library
(非常棒!):是否可以更改 TikZ/PGF 中箭头的大小?
您可以从 Luigi 提供的 sourceforge 链接中下载这两个.tex
文件,并将它们放在与主文件相同的目录中,然后使用pdflatex
或进行编译xelatex
。
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{arrows,arrows.new}
\begin{tikzpicture}[scale=4]
\coordinate (A) at (0,0);
\coordinate (B) at (1,0);
\coordinate (C) at (0,1);
\draw[thick] ($(A)$) -- ($(B)$) -- ($(C)$)-- cycle;
\foreach \x in {1, 2, ..., 10}
\foreach \y in {0, 1, ..., \x}
{\pgfmathsetmacro\arrowHeadsize{sqrt(0.1*(-0.2*\x + 0.1*\y+1)*(-0.2*\x + 0.1*\y+1)
+0.1*(1-0.1*\x)*(1-0.1*\x))}
\draw [thick, -stealth new, blue, arrow head=\arrowHeadsize cm]
($(B)-(0.1,0)+0.1*(1-\x,\y)$)
-- ++(0.02*\x - 0.2, -0.04*\x + 0.4 +0.02*\y-0.2);}
\end{tikzpicture}
\end{document}
输出如下:
上述解决方案与使用 PGFplots 的解决方案之间的主要区别quiver
在于,默认情况下,quiver
也会缩放箭头主体的粗细,而使用此方法时箭头粗细保持不变,只有箭头的大小发生了变化。