![pgfplots:在三维表面上定位法线和切向量](https://linux22.com/image/384145/pgfplots%EF%BC%9A%E5%9C%A8%E4%B8%89%E7%BB%B4%E8%A1%A8%E9%9D%A2%E4%B8%8A%E5%AE%9A%E4%BD%8D%E6%B3%95%E7%BA%BF%E5%92%8C%E5%88%87%E5%90%91%E9%87%8F.png)
我觉得应该有一种简单、好的方法绘制三维曲面并在曲面上的某个点放置一个(或多个)矢量,其中矢量是点和曲面的函数。例如,法向量。
我当然可以计算坐标并将其输入为draw
,但这似乎不是有效的方法。我正在寻找类似这样的东西:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[
]
\begin{axis}[
xlabel=$x$, ylabel=$y$,
domain=0:2,
domain y=-1.3:1.3,
]
\addplot3[
surf,
shader=interp,
]
{exp(-x^2-y^2)*x};
\addplot3[
black,-stealth,samples=2,
quiver,quiver/.cd,
u=-exp(-x^2-y^2)+2*exp(-x^2-y^2)*x^2,v=2*exp(-x^2-y^2)*x*y,w=1,
scale arrows=0.2,
] {exp(-x^2-y^2)*x};
\addplot3[
blue,-stealth,samples=2,
quiver,quiver/.cd,
u=2*exp(-x^2-y^2)*x*y,v=exp(-x^2-y^2)-2*exp(-x^2-y^2)*x^2,w=0,
scale arrows=5.8,
] {exp(-x^2-y^2)*x};
\end{axis}
\end{tikzpicture}
\end{document}
我只想控制放置向量的精确点(比如,x=1
和y=0
,并pgfplots
计算相应的z
坐标和向量等)。
答案1
我能做的是告诉您如何在预定义位置绘制单个箭筒箭头。这可以使用表格来完成。但是,我无法确信这些是曲面的切线和法线。除了二维曲面具有二维切线空间(意味着没有单个切线)这一事实之外,还缺少函数值的信息。对我来说,以下代码的输出只是分别由x=0
或y=0
定义的曲线上的两条切线,但连接在z=0
而不是z=f(x,y)
。(很可能是我引入了符号错误。我很乐意进一步扩展这一点。在我看来,有两个定义明确的箭头状对象可以绘制:梯度和法线。您是否在暗中寻找它们?)declare function
如果要处理想要多次使用的冗长表达式,使用它也是有意义的。
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=exp(-\x*\x-\y*\y)*\x;
dfdx(\x,\y)=exp(-\x*\x-\y*\y)-2*exp(-\x*\x-\y*\y)*\x^2;
dfdy(\x,\y)=-2*exp(-\x*\x-\y*\y)*\x*\y;}]
\begin{axis}[
xlabel=$x$, ylabel=$y$,
domain=0:2,
domain y=-1.3:1.3,
]
\addplot3[
surf,
shader=interp,
]
{f(x,y)};
\addplot3 [color=blue,-stealth,
quiver={u={-dfdx(\thisrow{x},\thisrow{y})},v={-dfdy(\thisrow{x},\thisrow{y})},
w=1,scale arrows=0.2},
] table {
x y z
1 0 0
0.7 0.2 0
};
\addplot3 [color=blue,-stealth,
quiver={u={-dfdy(\thisrow{x},\thisrow{y})},v={dfdx(\thisrow{x},\thisrow{y})},
w=0,scale arrows=2},
] table {
x y z
1 0 0
0.7 0.2 0
};
\end{axis}
\end{tikzpicture}
\end{document}
至于评论中的问题:你可以添加坐标z
。一种可能性是
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=exp(-\x*\x-\y*\y)*\x;
dfdx(\x,\y)=exp(-\x*\x-\y*\y)-2*exp(-\x*\x-\y*\y)*\x^2;
dfdy(\x,\y)=-2*exp(-\x*\x-\y*\y)*\x*\y;}]
\pgfmathsetmacro{\fone}{f(1,0)}
\pgfmathsetmacro{\ftwo}{f(0.7,0.2)}
\begin{axis}[
xlabel=$x$, ylabel=$y$,
domain=0:2,
domain y=-1.3:1.3,
]
\addplot3[
surf,
shader=interp,
]
{f(x,y)};
\addplot3 [color=blue,-stealth,
quiver={u={-dfdx(\thisrow{x},\thisrow{y})},v={-dfdy(\thisrow{x},\thisrow{y})},
w=1,scale arrows=0.2}, % ,z={f(\thisrow{x},\thisrow{y})}
] table {
x y z
1 0 \fone
0.7 0.2 \ftwo
};
\addplot3 [color=blue,-stealth,
quiver={u={-dfdy(\thisrow{x},\thisrow{y})},v={dfdx(\thisrow{x},\thisrow{y})},
w=0,scale arrows=2},
] table {
x y z
1 0 \fone
0.7 0.2 \ftwo
};
\end{axis}
\end{tikzpicture}
\end{document}
我想必须这是一种更简单的添加z
坐标的方法。但我仍然不确定我是否知道我在这里做什么。如果我知道你真正想要绘制什么,我会更加热情。能绘制参数曲线在x
和y
方向上的切线,它们的矢量积得出法线。到目前为止,我们w
手动添加,但我们可以直接计算,不是吗?