3D 表面图

3D 表面图

我正在使用 TIKZ(tikz-3d)图创建笛卡尔网格并创建穿过该表面的表面(球体的一部分)。

首先,我使用以下代码创建一个 3D 笛卡尔网格:-

\usepackage{pgf,tikz}
\usepackage{pgfplots}
\usepackage{tikz-3dplot}
\usepackage{mathrsfs}
\usetikzlibrary{arrows}
\pagestyle{empty}


\begin{document}

    \newcommand{\csize}{2}

    \tdplotsetmaincoords{75}{105}
    \begin{tikzpicture}
    [tdplot_main_coords,
    grid/.style={very thin,gray},
    axis/.style={->,blue,very thick},
    cube/.style={opacity=.5,very thick,fill=red},
    ccube/.style={opacity=.1,thin,fill=yellow!20!white},
    plane/.style={opacity=.5,draw=none,fill=blue!20!white},
    line/.style={very thick}]

    % bottom plane
    \draw[plane] (-0.5,-0.5,0) -- (7.5,-0.5,0) -- (7.5,7.5,0) -- (-0.5,7.5,0) -- cycle;


    %draw the axes
    \draw[axis] (0,0,0) -- (8,0,0) node[anchor=west]{$y$};
    \draw[axis] (0,0,0) -- (0,8,0) node[anchor=west]{$x$};
    \draw[axis] (0,0,0) -- (0,0,7) node[anchor=west]{$z$};

    \foreach \x in {0,2,4}
    \foreach \y in {0,2,4}
    \foreach \z in {0,2,4}
    {
        \ifthenelse{\x = 2 \AND \y = 2 \AND \z = 2}
        {
            \coordinate (O) at (2,2,2);
            %draw the bottom of the cube
            \draw[cube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,0,0)$) -- cycle;
            \draw[cube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[cube] (O) -- ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,0,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[cube] ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
            \draw[cube] ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- cycle;
            \draw[cube] ($ (O) + (0,0,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
        }
        {
            \coordinate (O) at (\x,\y,\z);
            %draw the bottom of the cube
            \draw[ccube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,0,0)$) -- cycle;
            \draw[ccube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[ccube] (O) -- ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,0,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[ccube] ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
            \draw[ccube] ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- cycle;
            \draw[ccube] ($ (O) + (0,0,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
        }
    }

    \end{tikzpicture}

\end{document}

由此得出下图: 在此处输入图片描述

\tdplotsphericalsurfaceplot现在,我继续利用在创建笛卡尔网格之前放置的以下代码块的函数来添加球面。

\tdplotsetpolarplotrange{0}{90}{0}{180}
\tdplotsphericalsurfaceplot[opacity=.2]{72}{36}{5}{blue!20!white}{blue!20!white}%
{\draw[color=black,thick,->] (0,0,0) -- (1,0,0) node[anchor=north east]{$x$};}% just for debugging
{\draw[color=black,thick,->] (0,0,0) -- (0,1,0) node[anchor=north west]{$y$};}% just for debugging
{\draw[color=black,thick,->] (0,0,0) -- (0,0,1) node[anchor=south]{$z$};}% just for debugging

这导致

在此处输入图片描述

我的问题是如何将球体中心移到远处并使半径足够大(我可以通过将 5 更改为某个大数字来更改半径),以便只有一部分表面穿过红色立方体(和相关的邻居)。本质上是如何改变球体的原点,同时保持所有其他事物不变。

答案1

欢迎使用 TeX.SE!移动球体的原点非常简单:只需将其放入范围内即可\begin{scope}[shift={(<xshift>,<yshift>,<zshift>)}] ... \end{scope}

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{arrows}
\begin{document}

\newcommand{\csize}{2}
\tdplotsetmaincoords{75}{105}
\begin{tikzpicture}
    [tdplot_main_coords,
    grid/.style={very thin,gray},
    axis/.style={->,blue,very thick},
    cube/.style={opacity=.5,very thick,fill=red},
    ccube/.style={opacity=.1,thin,fill=yellow!20!white},
    plane/.style={opacity=.5,draw=none,fill=blue!20!white},
    line/.style={very thick}]

    % bottom plane
    \draw[plane] (-0.5,-0.5,0) -- (7.5,-0.5,0) -- (7.5,7.5,0) -- (-0.5,7.5,0) -- cycle;


    %draw the axes
    \draw[axis] (0,0,0) -- (8,0,0) node[anchor=west]{$y$};
    \draw[axis] (0,0,0) -- (0,8,0) node[anchor=west]{$x$};
    \draw[axis] (0,0,0) -- (0,0,7) node[anchor=west]{$z$};

    \foreach \x in {0,2,4}
    \foreach \y in {0,2,4}
    \foreach \z in {0,2,4}
    {
        \ifthenelse{\x = 2 \AND \y = 2 \AND \z = 2}
        {
            \coordinate (O) at (2,2,2);
            %draw the bottom of the cube
            \draw[cube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,0,0)$) -- cycle;
            \draw[cube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[cube] (O) -- ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,0,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[cube] ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
            \draw[cube] ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- cycle;
            \draw[cube] ($ (O) + (0,0,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
        }
        {
            \coordinate (O) at (\x,\y,\z);
            %draw the bottom of the cube
            \draw[ccube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,0,0)$) -- cycle;
            \draw[ccube] (O) -- ($ (O) + (0,\csize,0)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[ccube] (O) -- ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,0,\csize)$) -- ($ (O) + (0,0,\csize)$) -- cycle;
            \draw[ccube] ($ (O) + (\csize,0,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
            \draw[ccube] ($ (O) + (0,\csize,0)$) -- ($ (O) + (\csize,\csize,0)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- cycle;
            \draw[ccube] ($ (O) + (0,0,\csize)$) -- ($ (O) + (0,\csize,\csize)$) -- ($ (O) + (\csize,\csize,\csize)$) -- ($ (O) + (\csize,0,\csize)$) -- cycle;
        }
    }
    \begin{scope}[shift={(0,-4,0)},opacity=0.2]
    \tdplotsetpolarplotrange{0}{90}{00}{180}
    \tdplotsphericalsurfaceplot{72}{36}{6}{blue!20!white}{blue!20!white}%
        {\draw[color=black,thick,->] (0,0,0) -- (1,0,0) node[anchor=north east]{$x$};}% just for debugging
        {\draw[color=black,thick,->] (0,0,0) -- (0,1,0) node[anchor=north west]{$y$};}% just for debugging
        {\draw[color=black,thick,->] (0,0,0) -- (0,0,1) node[anchor=south]{$z$};}% just for debugging
    \end{scope}     

\end{tikzpicture}
\end{document}

在此处输入图片描述

但请注意,我无法使用您披露的命令重现您提供的屏幕截图。如何实现这一点?当然,球体的中心在这里发生了移动。

相关内容