我想使用 tikz 绘制一系列圆锥体。我的圆锥体具有我事先计算的任意坐标。对于 n 个圆锥体,我有 n+1 个圆的坐标,每个圆都是 (深度、中心、半径) 的元组。所有圆都位于 XY 平面上。
我想到的是这样的:
我喜欢横截面,因为它们给人一种深度的印象。这是本科论文的插图,如果您有任何建议,请随时发表评论。横截面(在 XZ 平面中)将紧挨着它,具有适当的轴和单位。这只是为了提供适当的 3D 印象。
进一步解释一下:我不想要代码(毕竟我没有给出任何坐标......)但我在手册中看到了这一点:
指定点的第二种方法是将它们放在外部文件中。目前,TikZ 允许的唯一格式如下:文件的每一行应包含一行,以两个数字开头,以空格分隔。行上两个数字后面的所有内容都将被忽略。
现在我想从文件中读取任意数据。类似于(深度、中心 x、中心 y、半径)之类的东西,无论什么都最容易被 tikz 读取。我以前没有这样做过,如果是 tikz,我会特别有兴趣将文件中的值放入 foreach 循环中。我想我可以从那里处理实际的绘图。
答案1
使用 datatool 包后我得到了以下代码:
\tikzsetnextfilename{MyCool3dGraphic}
\begin{tikzpicture}
\DTLloaddb[keys={za,xa,ra,zb,xb,rb}]{coordinates}{Bilder/kh_3d.dat}
\pgfplotsset{
colormap={blackwhite}{gray(0cm)=(1); gray(1cm)=(0.8)}
}
\begin{axis}[
height=15cm, width=15cm,
domain=0:5,
y domain=0:2*pi,
samples=2,
samples y=32,
grid=both,
xmin=-50e-6,
xmax=50e-6,
scaled ticks=false,
xlabel=x,
xtick={-40e-6,-20e-6,0,20e-6,40e-6},
xticklabels={-40,-20,0,\si{\micro\metre},40},
ylabel=y,
ytick={-40e-6,-20e-6,0,20e-6,40e-6},
yticklabels={-40,-20,{~0},\si{\micro\metre},40},
zlabel=z,
ztick={-5e-4,-4e-4,-3e-4,-2e-4,-1e-4,0},
zticklabels={{-0,5},{-0,4},{-0,3},{-0,2},mm,0},
ymin=-50e-6,
ymax=50e-6,
zmax=0,
zmin=-508e-6,
unit vector ratio=3 3 1]
\def\za{5}
\def\xa{1}
\def\ra{1.5}
\def\zb{0}
\def\xb{0}
\def\rb{1}
\def\rsc{(\rb-\ra)/(\zb-\za)}
\def\xsc{(\xb-\xa)/(\zb-\za)}
\DTLforeach*{coordinates}{\za=za, \xa=xa, \ra=ra, \zb=zb, \xb=xb, \rb=rb}{
\addplot3[surf, shader=flat, draw=black, z buffer=sort, domain=\za:\zb]
({(\ra + (x-\za) * \rsc) * cos(deg(y)) + \xa + (x-\za) * \xsc},
{ (\ra + (x-\za) * \rsc) * sin(deg(y))},
{x});
}
\end{axis}
\end{tikzpicture}
这使用了一个自定义文件,其中包含每个锥体的正确数据。即底部 z 值、中心和半径以及上部 z 值中心和半径。(6 列)重要的是只对域使用 2 个样本,否则 pdftex 将花费很长时间。(或最终耗尽内存)
因此图片看起来是这样的:
那张图片显然超出了 tex 的极限。虽然我可以用 pdftex 编译一个最小示例,但我无法将其集成到我的论文中。pdftex 内存不足。(即使用 --extra-mem-bot=200000000)是的,当我使用外部化时也会发生这种情况。解决方案是告诉 tikz 调用 luatex 来生成图片:
\tikzset{external/system call={lualatex \tikzexternalcheckshellescape --interaction=nonstopmode --jobname "\image" "\texsource"}}
一直有效。