从文件中绘制 3D 对象序列的简洁方法

从文件中绘制 3D 对象序列的简洁方法

我想使用 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 将花费很长时间。(或最终耗尽内存)

因此图片看起来是这样的: pgf 图

那张图片显然超出了 tex 的极限。虽然我可以用 pdftex 编译一个最小示例,但我无法将其集成到我的论文中。pdftex 内存不足。(即使用 --extra-mem-bot=200000000)是的,当我使用外部化时也会发生这种情况。解决方案是告诉 tikz 调用 luatex 来生成图片:

\tikzset{external/system call={lualatex \tikzexternalcheckshellescape --interaction=nonstopmode --jobname "\image" "\texsource"}}

一直有效。

相关内容