
¿Cómo puedo dibujar una región sombreada simple como la que se muestra a continuación usando TikZ?
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 fillbetween
comandos, 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
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
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.
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.
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
\foreach
se realiza para\i=1
o\i=2
, las curvas obtenidas no son "reales" (o al menos las pretendidas).El código puede parecer largo, pero lo que cuenta son los dos primeros
\foreach
comandos que dibujan elz=hcurvas de nivel. Después simplemente se copian y modifican para obtener elx=hyy=hcurvas de nivel.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}