绘制球面 $x^2+y^2+z^2=1$ 与平面 $x+z=0$ 的交平面

绘制球面 $x^2+y^2+z^2=1$ 与平面 $x+z=0$ 的交平面

我想绘制球面 $x^2+y^2+z^2=1$ 与平面 $x+z=0$ 的交平面。

查看编辑

我曾尝试借助https://tikz.net/parametric-sphere/

我的相交平面不太清晰。另外,我不确定此代码在哪里正确开发。

请帮忙。

\documentclass[tikz,border=10mm]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{math}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{1pt}
%
\begin{document}
    %
    \tdplotsetmaincoords{60}{130}
    \begin{tikzpicture}[tdplot_main_coords]
        % Parametric equations of the sphere
        \tikzmath{function equis(\r,\p,\t) {return \r * sin(\p r) * cos(\t r);};}
        \tikzmath{function ye(\r,\p,\t) {return \r * sin(\p r) * sin(\t r);};}
        \tikzmath{function zeta(\r,\p,\t) {return \r * cos(\p r);};}
        \pgfmathsetmacro{\tcero}{0.0}
        \pgfmathsetmacro{\phiInit}{0.0}
        \pgfmathsetmacro{\phiMid}{0.5*pi}
        \pgfmathsetmacro{\phiEnd}{pi}
        \pgfmathsetmacro{\thetaInit}{0.5*pi}
        \pgfmathsetmacro{\thetaMid}{1.85*pi}
        \pgfmathsetmacro{\thetaEnd}{2.5*pi}
        %
        \pgfmathsetmacro{\step}{0.02}
        \pgfmathsetmacro{\next}{\tcero+0.5*\step}
        \pgfmathsetmacro{\sig}{2.0*\step}
        \pgfmathsetmacro{\radio}{2.0}
        \pgfmathsetmacro{\sigP}{\phiMid+\step}
        \pgfmathsetmacro{\sigPp}{\sigP+\step}
        % Part of the z axis below the sphere
        \draw[dashed] (0,0,-1.25*\radio) -- (0,0,-\radio);
        % I start to draw the sphere from below
        % Part of the sphere under the plane z = 0
        \foreach \p in {\sigP,\sigPp,...,\phiEnd}{          \draw[gray,thick,opacity=0.15] plot[domain=\thetaInit:\thetaEnd,smooth,variable=\t]                 ({equis(\radio,\p,\t)},{ye(\radio,\p,\t)},{zeta(\radio,\p,\t)});        }
        % Then I draw the part of the coordinate axis that is inside the sphere. 
        %%% Coordinate axis
        \draw[thick,->] (0,0,0) -- (1.5*\radio,0,0) node [below left] {\footnotesize$x$};
        \draw[dashed] (0,0,0) -- (-1.25*\radio,0,0);
        \draw[thick,->] (0,0,0) -- (0,1.5*\radio,0) node [right] {\footnotesize$y$};
        \draw[dashed] (0,0,0) -- (0,-1.25*\radio,0);
        \draw[dashed] (0,0,0) -- (0,0,-\radio);
        % As a reference, I draw a circumference at z = 0 (phi = pi / 2).
        \draw[black,thick,opacity=0.25] plot[domain=0:2*pi,smooth,variable=\t]              ({equis(\radio,\phiMid,\t)},{ye(\radio,\phiMid,\t)},{zeta(\radio,\phiMid,\t)});
        % As a reference, I draw a circumference at x = 0 (theta = 0).
        %\draw[red,opacity=0.25] plot[domain=0:2*pi,smooth,variable=\t]     ({equis(\radio,\t,0)},{ye(\radio,\t,0)},{zeta(\radio,\t,0)});
        % As a reference, I draw a circumference at y = 0 (theta = pi/2).
        \draw[red,opacity=0.25] plot[domain=0:2*pi,smooth,variable=\t]              ({equis(\radio,\t,\thetaInit)},{ye(\radio,\t,\thetaInit)},{zeta(\radio,\t,\thetaInit)});
        %
        % Now I draw the part of the sphere that is behind the axis
        %
        \foreach \p in {\step,\sig,...,\phiMid}{
            \draw[gray,thick,opacity=0.25] plot[domain=\thetaInit:\thetaMid,smooth,variable=\t] 
                ({equis(\radio,\p,\t)},{ye(\radio,\p,\t)},{zeta(\radio,\p,\t)}); 
        }
        % Z axis that is inside the sphere
        % This part has to be in front of the rear part of the sphere
        \draw[thick] (0,0,0) -- (0,0,\radio);
  \draw[black,opacity=0.35,densely dotted] plot[domain=-3*pi/4:3*pi/4,smooth,variable=\t]               ({equis(\radio,\t,\thetaInit)},{ye(\radio,\t,\thetaInit)},{zeta(\radio,\t,\thetaInit)});
        %
        % Sphere (the part that is in front of the z axis)
        %
        \foreach \p in {\step,\sig,...,\phiMid}{
            \draw[gray,thick,opacity=0.1] plot[domain=\thetaMid:\thetaEnd,smooth,variable=\t] 
                ({equis(\radio,\p,\t)},{ye(\radio,\p,\t)},{zeta(\radio,\p,\t)}); 
        }
        % Part of the z axis that is above the sphere
        \draw[thick,->] (0,0,\radio) -- (0,0,1.5*\radio) node [above] {\footnotesize$z$};
       \filldraw[
        draw=black,%
        fill=black!20,opacity=0.45%
    ]          (2,2,-2)
            -- (-2,2,-2)
            -- (-2,-2,2)
            -- (2,-2,2)
            -- cycle;
            % As a reference, I draw a circumference at y = 0 (theta = pi/2).
          \draw[black,opacity=0.95] plot[domain=pi/2+pi/4:2*pi-pi/4,smooth,variable=\t]                 ({equis(\radio,\t,\thetaInit)},{ye(\radio,\t,\thetaInit)},{zeta(\radio,\t,\thetaInit)});
    \end{tikzpicture}
\end{document}

在此处输入图片描述

已编辑

**\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture} 
  \begin{axis}[
    view={35}{15},
    unit vector ratio=1 1 1,
    ticks = none,
    ymin=-2.8,
    ymax=0,
    xmax=2.8,
    xmin=0,
    zmin=0,
    zmax=2,
    axis lines=middle,
    xlabel=$x$,
    ylabel=$y$,
    zlabel=$z$,
    every axis x label/.style={at={(ticklabel* cs:1)},anchor=west},
    every axis y label/.style={at={(ticklabel* cs:0)},anchor=north east},
    every axis z label/.style={at={(ticklabel* cs:1)},anchor=south},
    x axis line style=-,
    y axis line style=-,
    z axis line style=-,
    clip=false
  ]
\addplot3[name path=toppath,fill=gray, opacity=0.1, fill opacity=0.4,samples=2] (x/4,2,-x/4);
\addplot3[name path=botpath,fill=gray, opacity=0.1, fill opacity=0.4,samples=2] (x/4,-2,-x/4);
\addplot [gray] fill between[of=toppath and botpath];
\addplot3[surf,shader=interp,domain=0:360,y domain=-90:90,opacity=0.5,
    colormap={bluewhite}{color=(blue) color=(blue!30)}] ({2*cos(y)*cos(x)},
    {2*cos(y)*sin(x)},{2*sin(y)});
\addplot3[samples y=0,domain=0:360,smooth]({2*cos(x)},  {2*sin(x)},0);
  \end{axis}
\end{tikzpicture}
\end{document}**

此代码运行良好,但\addplot [gray] fill between[of=toppath and botpath];存在问题。球体向左滑动。请帮忙。 在此处输入图片描述

答案1

您可以使用3d工具

    \documentclass[border=2mm]{standalone}
    \usepackage{tikz}
    \usetikzlibrary{3dtools}% https://github.com/marmotghost/tikz-3dtools
    \begin{document}
        \begin{tikzpicture}[3d/install view={phi=120,theta=70},line cap=butt,
            line join=round,declare function={R=3;},c/.style={circle,fill,inner sep=1pt}]
            \path
            (0,0,0) coordinate (O)
            ;
        \draw[blue,3d/screen coords] (O) circle[radius=R];
        
            \shade[ball color=white,3d/screen coords,opacity=0.7] (O) circle[radius=R];
            \path pic[blue]{3d/circle on sphere={R=R,C={(O)}}};
            \path  pic[red]{3d/circle on sphere={R=R, n={(1,0,1)}}}; %(1,0,1) is normal vector of the equation x + z = 0
\draw[3d/hidden] (0,0,0) -- (0,0,R)  (O)--(R,0,0) (O)--(0,R,0);
            
\draw[3d/visible, -stealth] (R,0,0) -- (R + 4,0,0) node[below]{$x$};
\draw[3d/visible,-stealth] (0,R,0) -- (0,R + 1,0) node[right]{$y$};
\draw[3d/visible, -stealth] (0,0,R) -- (0,0,R + 1.5) node[above]{$z$};
\path foreach \p/\g in {O/150}{(\p)node[c]{}+(\g:2.5mm) node{$\p$}};
\draw[fill=gray,opacity=0.2] (-R,R+1,R) -- (R,R+1,-R) -- (R,-R-1,-R) --(-R,-R-1,R) -- cycle;
    \end{tikzpicture}
    \end{document} 

在此处输入图片描述

答案2

使用 运行lualatex,但需要一些时间来计算交点:

\documentclass[pstricks]{standalone}
\usepackage{pst-solides3d}
\begin{document}

\begin{pspicture}[solidmemory](-4,-3)(2,4)
\psset{viewpoint=50 100 10 rtp2xyz,Decran=70,lightsrc=-20 50 20}
\axesIIID(2.5,6,2)
\psSolid[object=plan,definition=equation,args={[-1 0 1 0]},base=-1 2 -2 2,
  ngrid=40 40,fillcolor=red!30,linewidth=0pt,name=B1,action=none]
\psSolid[object=sphere,r=1,fillcolor=cyan,ngrid=72 72,name=C1,action=none](1,0,0)
\psSolid[object=fusion,linewidth=0.01pt,base=B1_s C1,linewidth=0.01pt,]
\defFunction[algebraic]{Circle}(t){0.5+0.5*cos(t)}{1/sqrt(2)*sin(t)}{0.5+0.5*cos(t)}
\psSolid[object=courbe,r=0,function=Circle,range=0 3.14,linecolor=red,linewidth=1.5pt]
\end{pspicture}

\end{document}

在此处输入图片描述

相关内容