Cómo dibujar un límite sombreado usando TikZ

Cómo dibujar un límite sombreado usando TikZ

¿Cómo puedo dibujar una región sombreada simple como la que se muestra a continuación usando TikZ?

límite sombreado

La región sombreada delimitada por la ecuación.

r1r2r3 - r1 - r2 - r3 + 2cos(theta)

y es r1=r2=r3=4. El límite cambiará ligeramente para diferentes valores de theta. A los efectos de esto, podemos suponer theta=0.

La idea aquí es usar TikZ con ciertas funciones y fillbetweencomandos, pero esto resulta complicado para los gráficos 3D. Este ejemplo podría usarse para trazar límites más complicados.

¡Cualquier consejo/publicación relevante sería útil!

EDITAR

Lo ideal sería una solución que solo use TiKZ y no pstricks.

Respuesta1

ingrese la descripción de la imagen aquí

Creo que las superficies implícitas se pueden dibujar en Ti.kZ cuando se pueden dibujar las curvas de nivel (u otras secciones de hiperplano). para la superficiexyz - x - y - z + 2 = 0(de hecho, para cualquier valor dethetaen la pregunta), las curvas de nivel son hipérbolas y no es difícil dibujarlas.

Algunos comentarios

  1. Cambié las coordenadas para tener el punto singular en el origen, es decir, consideré la superficie definida porxyz + xy + yz + zx = 0. Es sólo una traducción del anterior.

  2. Viendo el ejemplo que me dieron, representé sólo una "hoja" de la superficie; explícitamente consideré la porción de la superficie que vive en el cubo[-1, 5]^3y que es barrido por una sola rama de cadaz=hhipérbola.

  3. Paraz=0la hipérbola degenera en la unión de dos líneas. Paraz=-1vuelve a degenerar en dos líneas, pero una está en el infinito. Por estas razones, el dibujo de la curva de nivel depende del signo dez. en el barrio de-1las cosas son más sutiles desde los límites de TikZ son de fácil acceso. Por ejemplo, si la primera \foreachse realiza para \i=1o \i=2, las curvas obtenidas no son "reales" (o al menos las pretendidas).

  4. El código puede parecer largo, pero lo que cuenta son los dos primeros \foreachcomandos que dibujan elz=hcurvas de nivel. Después simplemente se copian y modifican para obtener elx=hyy=hcurvas de nivel.

  5. Cada rama de una hipérbola se dibuja como una curva parametrizada; los límites del parámetro se calculan para obtener solo la porción dentro del cubo.

El código

\documentclass[margin=.5cm]{standalone}

\usepackage{tikz}
\usetikzlibrary{math}
\usepackage{tikz-3dplot}
\usetikzlibrary{3d}
\usetikzlibrary{arrows.meta}

\begin{document}

\xdefinecolor{Cy}{RGB}{17, 170, 187}
\xdefinecolor{VB}{RGB}{102, 25, 240}

\tikzmath{
  integer \N-, \N+;
  \N- = 12;
  \N+ = 50;
  real \a;
  \a = 5;
}
\tikzset{
  pics/level curve+/.style args={height=#1, varbound=#2, color=#3}{%
    code={%
      \draw[#3, variable=\t, domain=-#2:#2, samples=40]
      plot ({#1/(#1 +1)*(exp(\t) -1)}, {#1/(#1 +1)*(exp(-\t) -1)});
    }
  },
  pics/level curve-/.style args={height=#1, varbound=#2, color=#3}{%
    code={%
      \draw[#3, variable=\t, domain=-#2:#2, samples=40]
      plot ({-#1/(#1 +1)*(exp(\t) +1)}, {-#1/(#1 +1)*(exp(-\t) +1)});
    }
  }
}
\begin{tikzpicture}
  \tdplotsetmaincoords{76}{67}
  \begin{scope}[tdplot_main_coords]
    % axes first part
    \draw (-1, 0, 0) -- (\a +.2, 0, 0);
    \draw (0, -1, 0) -- (0, \a +.2, 0);
    \draw (0, 0, -1) -- (0, 0, \a +.2);
    
    %%% $z=h$ level curves
    % close to $0^-$
    \foreach \i
    [evaluate=\i as \h using {-(\N- +1 -\i)/(\N- +1))*\a/(\a +1)},
    evaluate=\i as \b using {ln(-(\h +1)*\a/\h -1)}]
    in {1, 2, 3, 4, ..., \N-}{
      \path[canvas is xy plane at z=\h, transform shape] (0, 0)
      pic {level curve-={height=\h, varbound=\b, color=Cy}};
    }    

    % $h=0$
    \draw[Cy, canvas is xy plane at z=0] (0, \a) |- (\a, 0);

    % $h>0$
    \foreach \i
    [evaluate=\i as \h using {(\i/\N+)*\a},
    evaluate=\i as \b using {ln((\h +1)*\a/\h +1)}]
    in {1, 2, ..., \N+}{
      \path[canvas is xy plane at z=\h, transform shape] (0, 0)
      pic {level curve+={height=\h, varbound=\b, color=Cy}};
    }

    %%% $y=h$ level curves
    % close to $0^-$
    \foreach \i
    [evaluate=\i as \h using {-(\N- +1 -\i)/(\N- +1))*\a/(\a +1)},
    evaluate=\i as \b using {ln(-(\h +1)*\a/\h -1)}]
    in {3, 4, ..., \N-}{
      \path[canvas is xz plane at y=\h, transform shape] (0, 0)
      pic {level curve-={height=\h, varbound=\b, color=Cy}};
    }    

    % $h=0$
    \draw[Cy, thin, canvas is xz plane at y=0] (0, \a) |- (\a, 0);
    
    % $h>0$
    \foreach \i
    [evaluate=\i as \h using {(\i/\N+)*\a},
    evaluate=\i as \b using {ln((\h +1)*\a/\h +1)}]
    in {1, 2, ..., \N+}{
      \path[canvas is xz plane at y=\h, transform shape] (0, 0)
      pic {level curve+={height=\h, varbound=\b, color=Cy}};
    }

    %%% $x=h$ level curves
    % close to $0^-$
    \foreach \i
    [evaluate=\i as \h using {-(\N- +1 -\i)/(\N- +1))*\a/(\a +1)},
    evaluate=\i as \b using {ln(-(\h +1)*\a/\h -1)}]
    in {3, 4, ..., \N-}{
      \path[canvas is yz plane at x=\h, transform shape] (0, 0)
      pic {level curve-={height=\h, varbound=\b, color=Cy}};
    }    

    % $h=0$
    \draw[VB, canvas is yz plane at x=0] (0, \a) |- (\a, 0);
    
    % $h>0$
    \foreach \i
    [evaluate=\i as \h using {(\i/\N+)*\a},
    evaluate=\i as \b using {ln((\h +1)*\a/\h +1)}]
    in {1, 2, ..., \N+}{
      \path[canvas is yz plane at x=\h, transform shape] (0, 0)
      pic {level curve+={height=\h, varbound=\b, color=VB}};
    }

    %%% axes second part
    \begin{scope}[arrows={->[length=1ex, width=1.5ex]}]
      \draw (\a, 0, 0) -- (\a +2, 0, 0)  node[pos=1.2] {$x$};
      \draw (0, \a, 0) -- (0, \a +2, 0)  node[pos=1.2] {$y$};
      \draw (0, 0, \a) -- (0, 0, \a +2)  node[pos=1.2] {$z$};          
    \end{scope}
  \end{scope}
\end{tikzpicture}

\end{document}

información relacionada