我有一个标量场 f(x,y)=1-x 和一条曲线 C,该曲线 C 是 g(x)=4x(1-x) 的图形。我的目标是填充曲线 (x,g(x),f(x,g(x))) 与其投影 (x,g(x),0) 之间的区域。到目前为止,我只能绘制一些(许多)支撑线,但这看起来很奇怪。我正在寻找一种解决方案,使用 fillbetween 或 clip 或者可能是结果参数曲面 y=4x(1-x) 的图,其中 x 在 0 和 1 之间,z 在 0 和 1-x 之间。
该图是沿参数化曲线的标量场的标准线积分的图形解释。
我目前的想法:
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{calc}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
declare function={f(\x,\y)=1-\x;},
declare function={g(\x)=4*\x*(1-\x);},
view={60}{30},
enlargelimits=false,
ticks=none
]
\pgfplotsinvokeforeach{0,0.001,...,1}{
\draw[gray] (#1,{g(#1)},{f(#1,#1)}) -- (#1,{g(#1)},0);
}
\addplot3[
name path=B,
variable=t,
mesh,
gray,
domain=0:1,
domain y=0:1,
] (t,{g(t)},0);
\addplot3[
name path=A,
variable=t,
mesh,
domain=0:1,
domain y=0:1,
] (t,{g(t)},{f(t,{g(t)})}); %\closedcycle;
%\addplot3[blue!50] fill between[of=B and A];
\end{axis}
\end{tikzpicture}
\end{document}
循环并不令人满意,因为它允许坐标轴/框线透过。有什么想法,如何实现这个目标?
答案1
作为替代方案,Asymptote
版本:
//
// param3d.asy
//
// to get a standalone param3d.png, run
// asy -f png -render=4 param3d.asy
//
import graph3;
size(200,0);
currentlight.background=paleyellow+opacity(0.0);
currentprojection=orthographic(camera=(65,-36,25),up=Z,target=(0,0,0),zoom=1);
triple fs1(pair t){
real u=t.x, v=t.y;
return (u,4*u*(1-u),(1-u)*(1-v));
}
surface s1=surface(fs1,(0,0),(1,1),nu=100,nv=100);
draw(s1,orange+opacity(0.8),meshpen=nullpen,render(merge=true));
draw(surface((0,0,0)--(1,0,0)--(1,1,0)--(0,1,0)--cycle),lightblue+thick());
答案2
虽然有点晚了,但我很惊讶仍然没有 Ti钾这个问题的 Z 解决方案。所以有一个非常简单的方案。
在等距透视中,很容易找到连接给定曲线和其 xy 平面投影(抛物线)的垂直线之间的切点。我手动使用此方法(见下文)。
\documentclass[tikz,border=2mm]{standalone}
% isometric perspective
\pgfmathsetmacro\xx{1/sqrt(2)}
\pgfmathsetmacro\xy{1/sqrt(6)}
\pgfmathsetmacro\zz{sqrt(2/3)}
\tikzset
{%
isometric/.style={x={(-\xx cm,-\xy cm)},y={(\xx cm,-\xy cm)},z={(0 cm,\zz cm)}},
surface/.style={draw=red,left color=#1!20,right color=#1!80,fill opacity=0.5}
}
\begin{document}
\begin{tikzpicture}[isometric,scale=4,line join=round]
% tangent point (easy to obtain with some geometry)
\coordinate (T) at (3/8,15/16,5/8);
% xy plane
\fill[green!20] (0,0,0) -- (1,0,0) -- (1,1,0) -- (0,1,0) -- cycle;
% axes
\draw[latex-latex] (1.25,0,0) node [below] {$x$} -- (0,0,0) -- (0,1.25,0) node [below] {$y$};
\draw[-latex] (0,0,0) -- (0,0,1.25) node [above] {$z$};
% surface
\draw[surface=gray] plot [domain=0:3/8,samples=16] (\x,{4*\x*(1-\x)},0) -- (T) --
plot [domain=3/8:0,samples=16] (\x,{4*\x*(1-\x)},1-\x) -- cycle;
\draw[surface=red] plot [domain=1:3/8,samples=26] (\x,{4*\x*(1-\x)},0) -- (T) --
plot [domain=3/8:1,samples=26] (\x,{4*\x*(1-\x)},1-\x) -- cycle;
\end{tikzpicture}
\end{document}
稍微解释一下:
- 首先我们将抛物线方程写成形式
(x-x_v)^2=2p(y-y_v)
,然后求出顶点V(v_x,v_y)
。在这个例子中是V(1/2,1)
。 - 从顶点我们可以得到焦点
F(v_x,v_y+p/2)
和准线y=v_y-p/2
。在我们的抛物线中,它们是F(1/2,15/16)
和y=17/16
。 - 我们从垂直于切线方向绘制一条直线(或找到其方程)
F
(因此该直线必须相对于二维轴水平)。 - 我们发现
P(3/8,17/16)
,前一条线和准线的交点。 - 现在是和 的
M(9/16,1)
中点。F
P
- 切线通过
M
且垂直。 - 最后,抛物线的切点
T(3/8,15/16)
是该曲线与切线的交点。参数曲线的切点位于上方,因此它是一个必须满足曲线方程的T
3d 点(另一个交点)。(3/8,15/16,z)