4

I am using TIKZ (tikz-3d) plot to create a cartesian grid and to create a surface(a section of a sphere) passing through the surface.

First I create a 3d cartesian mesh using the following code:-

\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}

Which leads to the following figure :- enter image description here

Now, I go on to add a spherical surface by making use of the function \tdplotsphericalsurfaceplot using the following block of code placed just before creating the cartesian grids.

\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

This leads to

enter image description here

My question is how to move the centre of the sphere to a far off distance and make the radius large enough (i can change the radius by changing 5 to some big number) so that only a section of the surface passes through the red cube (and associated neighbors). In essence how to change the origin of the sphere keeping all other things same.

1
  • I have removed the [geometry] tag, as that applies explicitly to the geometry package. Replaced it with [shapes]. Nov 22, 2019 at 3:11

1 Answer 1

5

Welcome to TeX.SE! It is absolutely straightforward to move the origin of the sphere around: just put it into a scope \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}

enter image description here

Note, however, that I was not able to reproduce the screen shot you provide with the commands you disclose. How do achieve that? Of course, the center of the sphere got shifted here.

2
  • its the sequence that you have altered, if you first plot the surface and then the grid you arrive at the snapshot that I have provided :) Thanks for the reply. If i have to only show the grid lines of the spherical surface at the ends and not the in between theta and phi then how to proceed ?
    – datapanda
    Nov 17, 2018 at 22:50
  • @datapanda Could you please provide a complete code that starts with \documentclass and ends with \end{document}? (Note that the packages \usepackage{pgfplots} and \usepackage{mathrsfs} are not used here.) And then please try to reword your last statement, in its present form I can't understand it.
    – user121799
    Nov 17, 2018 at 22:56

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .