
Wie kann ich mit TikZ einen einfachen schattierten Bereich wie den unten gezeigten zeichnen?
Der schattierte Bereich, der durch die Gleichung begrenzt wird
r1r2r3 - r1 - r2 - r3 + 2cos(theta)
und ist r1=r2=r3=4
. Die Grenze ändert sich bei verschiedenen Werten von leicht theta
. Zu diesem Zweck können wir annehmen theta=0
.
Die Idee hier ist, TikZ mit bestimmten Funktionen und Befehlen zu verwenden, fillbetween
aber dies wird bei 3D-Diagrammen schwierig. Dieses Beispiel könnte dann verwendet werden, um komplexere Grenzen zu zeichnen
Alle Tipps/relevanten Beiträge wären hilfreich!
BEARBEITEN
Idealerweise hätte ich gerne eine Lösung, die nur TiKZ und nicht pstricks verwendet.
Antwort1
Ich denke, dass implizite Oberflächen in Ti skizziert werden könnenkZ, wenn die Niveaukurven (oder andere Hyperebenenabschnitte) gezeichnet werden können. Für die Oberflächexyz - x - y - z + 2 = 0(eigentlich für jeden Wert vonThetain der Frage), sind die Niveaukurven Hyperbeln und es ist nicht schwierig, sie zu zeichnen.
Einige Kommentare
Ich habe die Koordinaten so geändert, dass der singuläre Punkt im Ursprung liegt, d. h. ich habe die Oberfläche betrachtet, die definiert ist durchxyz + xy + yz + zx = 0. Es ist lediglich eine Übersetzung des vorherigen.
Im gegebenen Beispiel habe ich nur ein „Blatt“ der Oberfläche dargestellt; explizit habe ich den Teil der Oberfläche betrachtet, der im Würfel lebt[-1, 5]^3und die von nur einem Zweig jedesz=hHyperbel.
Fürz=0die Hyperbel entartet zur Vereinigung zweier Geraden.z=-1es degeneriert wieder in zwei Linien, aber eine liegt im Unendlichen. Aus diesen Gründen hängt die Zeichnung der Niveaukurve vom Vorzeichen abz. In der Nähe von-1Die Dinge sind subtiler, da die Grenzen von TikZ sind leicht zu erreichen. Wenn beispielsweise die erste für oder
\foreach
durchgeführt wird , sind die erhaltenen Kurven nicht „real“ (oder zumindest nicht die beabsichtigten).\i=1
\i=2
Der Code mag lang erscheinen, aber was zählt, sind die ersten beiden
\foreach
Befehle, die diez=hPegelkurven. Anschließend werden sie einfach kopiert und modifiziert, um diex=hUndy=hNiveaukurven.Jeder Zweig einer Hyperbel wird als parametrisierte Kurve gezeichnet; die Grenzen des Parameters werden so berechnet, dass nur der Teil innerhalb des Würfels erhalten wird.
Der Code
\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}