我想用 TikZ 以黑白色重现类似这样的内容(仅显示图形而非文字):
这是我目前拥有的代码,但我不知道如何正确绘制这三个平面:
\documentclass[tikz, border=3pt]{standalone}
\usepackage{tikz,tikz-3dplot}
\tdplotsetmaincoords{80}{45}
\tdplotsetrotatedcoords{-90}{180}{-90}
%% style for surfaces
\tikzset{surface/.style={draw=black, fill=white, fill opacity=.6}}
%% macros to draw back and front of cones
%% optional first argument is styling; others are z, radius, side offset (in degrees)
\newcommand{\coneback}[4][]{
%% start at the correct point on the circle, draw the arc, then draw to the origin of the diagram, then close the path
\draw[canvas is xy plane at z=#2, #1] (45-#4:#3) arc (45-#4:225+#4:#3) -- (O) --cycle;
}
\newcommand{\conefront}[4][]{
\draw[canvas is xy plane at z=#2, #1] (45-#4:#3) arc (45-#4:-135+#4:#3) -- (O) --cycle;
}
\begin{document}
\begin{tikzpicture}[tdplot_main_coords]
\coordinate (O) at (0,0,0);
%% make sure to draw everything from back to front
\coneback[surface]{-3}{2}{-10}
\draw (0,0,-5) -- (O);
\conefront[surface]{-3}{2}{-10}
\draw[->] (-6,0,0) -- (6,0,0) node[right] {$x$};
\draw[->] (0,-6,0) -- (0,6,0) node[right] {$y$};
\coneback[surface]{3}{2}{10}
\draw[->] (O) -- (0,0,5) node[above] {$z$};
\conefront[surface]{3}{2}{10}
\end{tikzpicture}
\end{document}
更新:这是这两篇文章的结果(@Schrödinger 的猫的回答/来自另一个问题的修复)。代码包含一个修复程序,以应对过时的 tikz 3d 库。
\documentclass[tikz, border=3pt]{standalone}
\usepackage{tikz,tikz-3dplot}
\tdplotsetmaincoords{80}{110}
%This piece of code fixes the bug%
\usetikzlibrary{3d}
\makeatletter
\tikzoption{canvas is xy plane at z}[]{%
\def\tikz@plane@origin{\pgfpointxyz{0}{0}{#1}}%
\def\tikz@plane@x{\pgfpointxyz{1}{0}{#1}}%
\def\tikz@plane@y{\pgfpointxyz{0}{1}{#1}}%
\tikz@canvas@is@plane
}
\makeatother
%%%%%%%%%%%%
%% style for surfaces
\tikzset{surface/.style={draw=black, left color=orange,right color=orange,middle
color=orange!60!#1, fill opacity=1},surface/.default=white}
%% macros to draw back and front of cones
%% optional first argument is styling; others are z, radius, side offset (in degrees)
\newcommand{\coneback}[4][]{
%% start at the correct point on the circle, draw the arc, then draw to the origin of the diagram, then close the path
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3)
arc(\tdplotmainphi-#4:\tdplotmainphi+180+#4:#3) -- (O) --cycle;
}
\newcommand{\conefront}[4][]{
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3) arc
(\tdplotmainphi-#4:\tdplotmainphi-180+#4:#3) -- (O) --cycle;
}
\newcommand{\conetruncback}[6][]{
\draw[line join=round,#1] plot[variable=\t,domain=\tdplotmainphi-#4:\tdplotmainphi+180+#4]
({#3*cos(\t)},{#3*sin(\t)},#2)
-- plot[variable=\t,domain=\tdplotmainphi+180-#4:\tdplotmainphi+#4]
({#6*cos(\t)},{#6*sin(\t)},#5)
--cycle;
}
\newcommand{\conetruncfront}[6][]{
\draw[line join=round,#1] plot[variable=\t,domain=\tdplotmainphi-#4:\tdplotmainphi-180+#4]
({#3*cos(\t)},{#3*sin(\t)},#2)
-- plot[variable=\t,domain=\tdplotmainphi-180-#4:\tdplotmainphi+#4]
({#6*cos(\t)},{#6*sin(\t)},#5)
--cycle;
}
\begin{document}
\begin{tikzpicture}[tdplot_main_coords]
\coordinate (O) at (0,0,0);
\conetruncback[surface=black]{-2}{4/3}{0}{-3}{2}
\draw (0,0,-5) -- (0,0,-2);
\conetruncfront[surface]{-2}{4/3}{0}{-3}{2}
\draw[canvas is xy plane at z=-2,fill=green!40!black,fill opacity=1] (-3,-3) rectangle (3,3);
\coneback[surface=black]{-2}{4/3}{-10}
\draw (0,0,-2) -- (O);
\conefront[surface]{-2}{4/3}{-10}
\draw[canvas is xy plane at z=0,fill=teal,fill opacity=1] (-3,-3) rectangle (3,3);
\draw[->] (-6,0,0) -- (7,0,0) node[below] {$x$};
\draw[->] (0,-6,0) -- (0,6,0) node[right] {$y$};
\coneback[surface=white]{2}{4/3}{10}
\draw[-] (O) -- (0,0,2);
\conefront[surface=black]{2}{4/3}{10}
\draw[canvas is xy plane at z=2,fill=pink,fill opacity=1] (-3,-3) rectangle (3,3);
\conetruncback[surface=white]{2}{4/3}{0}{3}{2}
\draw[->] (0,0,2) -- (0,0,5) node[above] {$z$};
\conetruncfront[surface=black]{2}{4/3}{0}{3}{2}
\end{tikzpicture}
\end{document}
答案1
您几乎已经完成了。绘制平面就像说
\draw[canvas is xy plane at z=2,fill=blue,fill opacity=0.6] (-4,-4) rectangle (4,4);
除此之外,您还需要分别绘制平面下方和上方的圆锥部分,这就是我为截头圆锥添加宏的原因。我还用\conetruncfront
替换了硬编码。45
\tdplotmainphi
\documentclass[tikz, border=3pt]{standalone}
\usepackage{tikz,tikz-3dplot}
\tdplotsetmaincoords{80}{45}
%% style for surfaces
\tikzset{surface/.style={draw=black, fill=white, fill opacity=.6}}
%% macros to draw back and front of cones
%% optional first argument is styling; others are z, radius, side offset (in degrees)
\newcommand{\coneback}[4][]{
%% start at the correct point on the circle, draw the arc, then draw to the origin of the diagram, then close the path
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3)
arc(\tdplotmainphi-#4:\tdplotmainphi+180+#4:#3) -- (O) --cycle;
}
\newcommand{\conefront}[4][]{
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3) arc
(\tdplotmainphi-#4:\tdplotmainphi-180+#4:#3) -- (O) --cycle;
}
\newcommand{\conetruncfront}[6][]{
\draw[line join=round,#1] plot[variable=\t,domain=\tdplotmainphi-#4:\tdplotmainphi-180+#4]
({#3*cos(\t)},{#3*sin(\t)},#2)
-- plot[variable=\t,domain=\tdplotmainphi-180-#4:\tdplotmainphi+#4]
({#6*cos(\t)},{#6*sin(\t)},#5)
--cycle;
}
\begin{document}
\begin{tikzpicture}[tdplot_main_coords]
\coordinate (O) at (0,0,0);
%% make sure to draw everything from back to front
\coneback[surface]{-3}{2}{-10}
\draw (0,0,-5) -- (O);
\conefront[surface]{-3}{2}{-10}
\draw[canvas is xy plane at z=-2,fill=green!60!black,fill opacity=0.6] (-4,-4) rectangle (4,4);
\coneback[surface]{-2}{4/3}{-10}
\draw (0,0,-2) -- (O);
\conefront[surface]{-2}{4/3}{-10}
\draw[canvas is xy plane at z=0,fill=blue,fill opacity=0.6] (-4,-4) rectangle (4,4);
\draw[->] (-6,0,0) -- (6,0,0) node[right] {$x$};
\draw[->] (0,-6,0) -- (0,6,0) node[right] {$y$};
\coneback[surface]{3}{2}{10}
\draw[->] (O) -- (0,0,5) node[above] {$z$};
\conefront[surface]{3}{2}{10}
\draw[canvas is xy plane at z=2,fill=purple,fill opacity=0.6] (-4,-4) rectangle (4,4);
\draw[->] (0,0,2) -- (0,0,5) node[above] {$z$};
\conetruncfront[surface]{2}{4/3}{0}{3}{2}
\end{tikzpicture}
\end{document}
不过,我会稍微改变一下
\documentclass[tikz, border=3pt]{standalone}
\usepackage{tikz,tikz-3dplot}
\tdplotsetmaincoords{80}{45}
%% style for surfaces
\tikzset{surface/.style={draw=black, left color=yellow,right color=yellow,middle
color=yellow!60!#1, fill opacity=.6},surface/.default=white}
%% macros to draw back and front of cones
%% optional first argument is styling; others are z, radius, side offset (in degrees)
\newcommand{\coneback}[4][]{
%% start at the correct point on the circle, draw the arc, then draw to the origin of the diagram, then close the path
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3)
arc(\tdplotmainphi-#4:\tdplotmainphi+180+#4:#3) -- (O) --cycle;
}
\newcommand{\conefront}[4][]{
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3) arc
(\tdplotmainphi-#4:\tdplotmainphi-180+#4:#3) -- (O) --cycle;
}
\newcommand{\conetruncback}[6][]{
\draw[line join=round,#1] plot[variable=\t,domain=\tdplotmainphi-#4:\tdplotmainphi+180+#4]
({#3*cos(\t)},{#3*sin(\t)},#2)
-- plot[variable=\t,domain=\tdplotmainphi+180-#4:\tdplotmainphi+#4]
({#6*cos(\t)},{#6*sin(\t)},#5)
--cycle;
}
\newcommand{\conetruncfront}[6][]{
\draw[line join=round,#1] plot[variable=\t,domain=\tdplotmainphi-#4:\tdplotmainphi-180+#4]
({#3*cos(\t)},{#3*sin(\t)},#2)
-- plot[variable=\t,domain=\tdplotmainphi-180-#4:\tdplotmainphi+#4]
({#6*cos(\t)},{#6*sin(\t)},#5)
--cycle;
}
\begin{document}
\begin{tikzpicture}[tdplot_main_coords]
\coordinate (O) at (0,0,0);
\conetruncback[surface=black]{-2}{4/3}{0}{-3}{2}
\draw (0,0,-5) -- (0,0,-2);
\conetruncfront[surface]{-2}{4/3}{0}{-3}{2}
\draw[canvas is xy plane at z=-2,fill=green!60!black,fill opacity=0.6] (-4,-4) rectangle (4,4);
\coneback[surface=black]{-2}{4/3}{-10}
\draw (0,0,-2) -- (O);
\conefront[surface]{-2}{4/3}{-10}
\draw[canvas is xy plane at z=0,fill=blue,fill opacity=0.6] (-4,-4) rectangle (4,4);
\draw[->] (-6,0,0) -- (6,0,0) node[right] {$x$};
\draw[->] (0,-6,0) -- (0,6,0) node[right] {$y$};
\coneback[surface=white]{2}{4/3}{10}
\draw[-] (O) -- (0,0,2);
\conefront[surface=black]{2}{4/3}{10}
\draw[canvas is xy plane at z=2,fill=purple,fill opacity=0.6] (-4,-4) rectangle (4,4);
\conetruncback[surface=white]{2}{4/3}{0}{3}{2}
\draw[->] (0,0,2) -- (0,0,5) node[above] {$z$};
\conetruncfront[surface=black]{2}{4/3}{0}{3}{2}
\end{tikzpicture}
\end{document}
或者使用略微不同的视角并将不透明度设置为 1,并按照 minhthien_2016 的建议进行调整。
\documentclass[tikz, border=3pt]{standalone}
\usepackage{tikz,tikz-3dplot}
\tdplotsetmaincoords{80}{60}
%% style for surfaces
\tikzset{surface/.style={draw=black, left color=yellow,right color=yellow,middle
color=yellow!60!#1, fill opacity=1},surface/.default=white}
%% macros to draw back and front of cones
%% optional first argument is styling; others are z, radius, side offset (in degrees)
\newcommand{\coneback}[4][]{
%% start at the correct point on the circle, draw the arc, then draw to the origin of the diagram, then close the path
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3)
arc(\tdplotmainphi-#4:\tdplotmainphi+180+#4:#3) -- (O) --cycle;
}
\newcommand{\conefront}[4][]{
\draw[canvas is xy plane at z=#2, #1] (\tdplotmainphi-#4:#3) arc
(\tdplotmainphi-#4:\tdplotmainphi-180+#4:#3) -- (O) --cycle;
}
\newcommand{\conetruncback}[7][]{
\draw[line join=round,#1] plot[variable=\t,domain=\tdplotmainphi-#4:\tdplotmainphi+180+#4]
({#3*cos(\t)},{#3*sin(\t)},#2)
-- plot[variable=\t,domain=\tdplotmainphi+180-#7:\tdplotmainphi+#7]
({#6*cos(\t)},{#6*sin(\t)},#5)
--cycle;
}
\newcommand{\conetruncfront}[7][]{
\draw[line join=round,#1] plot[variable=\t,domain=\tdplotmainphi-#4:\tdplotmainphi-180+#4]
({#3*cos(\t)},{#3*sin(\t)},#2)
-- plot[variable=\t,domain=\tdplotmainphi-180-#7:\tdplotmainphi+#7]
({#6*cos(\t)},{#6*sin(\t)},#5)
--cycle;
}
\begin{document}
\begin{tikzpicture}[tdplot_main_coords]
\coordinate (O) at (0,0,0);
\conetruncback[surface=black]{-2}{4/3}{-5}{-3}{2}{5}
\draw (0,0,-5) -- (0,0,-2);
\conetruncfront[surface]{-2}{4/3}{-5}{-3}{2}{5}
\draw[canvas is xy plane at z=-2,fill=green!60!black,fill opacity=1] (-4,-4) rectangle (4,4);
\coneback[surface=black]{-2}{4/3}{-10}
\draw (0,0,-2) -- (O);
\conefront[surface]{-2}{4/3}{-10}
\draw[canvas is xy plane at z=0,fill=blue,fill opacity=1] (-4,-4) rectangle (4,4);
\draw[->] (-6,0,0) -- (6,0,0) node[right] {$x$};
\draw[->] (0,-6,0) -- (0,6,0) node[right] {$y$};
\coneback[surface=white]{2}{4/3}{10}
\draw[-] (O) -- (0,0,2);
\conefront[surface=black]{2}{4/3}{10}
\draw[canvas is xy plane at z=2,fill=purple,fill opacity=1] (-4,-4) rectangle (4,4);
\conetruncback[surface=white]{2}{4/3}{5}{3}{2}{-5}
\draw[->] (0,0,2) -- (0,0,5) node[above] {$z$};
\conetruncfront[surface=black]{2}{4/3}{5}{3}{2}{-5}
\end{tikzpicture}
\end{document}
答案2
运行xelatex
:
\documentclass[border=10pt,pstricks]{standalone}
\usepackage{pst-solides3d}
\begin{document}
\psset{unit=0.5}
\begin{pspicture}[linewidth=0.1pt](-7,-7)(7,7)
\psset[pst-solides3d]{viewpoint=20 10 20 rtp2xyz,Decran=50,lightsrc=20 10 5,solidmemory}
\psSolid[object=grille,base=-2 2 -2 2,ngrid=30,name=A](0,0,-1.5)
\psSolid[object=grille,base=-2 2 -2 2,ngrid=30,name=B](0,0,0)
\psSolid[object=grille,base=-2 2 -2 2,ngrid=30,name=C](0,0,1.5)
\defFunction{cone}(u,v){u v Cos mul}{u v Sin mul}{u}
\psSolid[object=surfaceparametree,base=-2 2 0 2 pi mul,
inhue=0.8 0.2,hue=0.8 0.2,function=cone,linewidth=0.1pt,ngrid=25 40,name=D]
\psSolid[object=fusion,base=A B C D,linecolor=black!10]
\axesIIID(0,0,1.5)(2,2,3)
\end{pspicture}
\end{document}
答案3
有趣的渐近线解决方案!我还没有清理我的代码。
无不透明度 ( opacity(1)
)
和opacity(.5)
// http://asymptote.ualberta.ca/
import graph3;
currentprojection=orthographic(2,2,.5,zoom=.9);
unitsize(1cm);
pen plane1=red, plane2=cyan, plane3=blue,pcone=yellow;
real a=1.8,h=3;
surface c=scale(a,a,h)*shift(0,0,-1)*unitcone;
draw(zscale3(-1)*c,pcone+opacity(.5));
draw(c,pcone+opacity(.3));
real b=2.2;
path3 g=scale3(b/a)*unitcircle3;
draw(shift(0,0,b)*g,plane1+1pt);
draw(shift(0,0,-b)*g,plane3+1pt);
surface pl=shift(-3,-4,0)*scale(6,8,0)*unitplane;
draw(shift(0,0,b)*pl,plane1+opacity(.3));
draw(pl,plane2+opacity(.3));
draw(shift(0,0,-b)*pl,plane3+opacity(.3));
draw(Label("$\eta_1$",EndPoint),O--4*X,Arrow3);
draw(Label("$\eta_2$",EndPoint),O--5*Y,Arrow3);
draw(Label("$\eta_3$",EndPoint,align=E),-3Z--4*Z,Arrow3);