使箭头的大小与 TikZ 中的矢量场的大小成比例

使箭头的大小与 TikZ 中的矢量场的大小成比例

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也会缩放箭头主体的粗细,而使用此方法时箭头粗细保持不变,只有箭头的大小发生了变化。

相关内容