如何填充具有可变高度的三维参数曲线下的区域?

如何填充具有可变高度的三维参数曲线下的区域?

我有一个标量场 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}

在此处输入图片描述

稍微解释一下:

  1. 首先我们将抛物线方程写成形式(x-x_v)^2=2p(y-y_v),然后求出顶点V(v_x,v_y)。在这个例子中是V(1/2,1)
  2. 从顶点我们可以得到焦点F(v_x,v_y+p/2)和准线y=v_y-p/2。在我们的抛物线中,它们是F(1/2,15/16)y=17/16
  3. 我们从垂直于切线方向绘制一条直线(或找到其方程)F(因此该直线必须相对于二维轴水平)。
  4. 我们发现P(3/8,17/16),前一条线和准线的交点。
  5. 现在是和 的M(9/16,1)中点。FP
  6. 切线通过M且垂直。
  7. 最后,抛物线的切点T(3/8,15/16)是该曲线与切线的交点。参数曲线的切点位于上方,因此它是一个必须满足曲线方程的T3d 点(另一个交点)。(3/8,15/16,z)

在此处输入图片描述

相关内容