大约两年前,我在这个论坛上看到了一个交互式 3D 图表,可能是用 latex 制作的,可能使用了 pgfplots。基本上,用户可以使用鼠标拖动(或滑动)pdf 图表来更改查看图表的角度。基于原始代码,我创建了两个静态图表,如下所示(请忽略添加的黑线)。不知何故,我丢失了当前项目所需的交互式 3D 图表的原始代码。我整个下午和晚上都在网上搜索,但仍然找不到它(可能是原作者删除了它),所以有人可以给我指明正确的方向或提供一个类似的例子,让我有个开始。顺便说一句,我想创建一个交互式 pdf,这样我就可以拖动以从不同角度查看第三张图片中形状的不同视图。谢谢。
这些是我用来创建这两个图表的代码。
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\begin{document}
% 3D
\pgfplotsset{%
colormap={myblack}{rgb255(0cm)=(0,0,0); rgb255(1cm)=(0,0,0)},
}
\pgfplotsdefinecstransform{polarrad along x}{cart}{%
% First, swap axis such that we can apply polarrad->cart.
% Note that polarrad expects (<angle>,<radius>,Z):
\pgfkeysgetvalue{/data point/x}\X
\pgfkeysgetvalue{/data point/y}\Y
\pgfkeyslet{/data point/y}\X
\pgfkeyslet{/data point/x}\Y
\pgfplotsaxistransformcs
{polarrad}
{cart}%
%
% Ok, now we have cartesian. Swap axes such that we have them
% along X:
\pgfkeysgetvalue{/data point/x}\X
\pgfkeysgetvalue{/data point/y}\Y
\pgfkeysgetvalue{/data point/z}\Z
\pgfkeyslet{/data point/y}\X
\pgfkeyslet{/data point/z}\Y
\pgfkeyslet{/data point/x}\Z
}%
\begin{tikzpicture}
% This creates a color gradient for the filled area of the two functions
\pgfdeclareverticalshading{brighter}{100bp}{
rgb(0bp)=(0.1,0.55,0);
rgb(100bp)=(0.8,0.9,0)
}
%
\pgfdeclareverticalshading{darker}{100bp}{
rgb(0bp)=(0.5,0.75,0);
rgb(100bp)=(0,0.5,0)
}
%
\begin{axis}[axis lines=middle,
title={},
view={30}{30},
colormap name=myblack]
\def\generatrix{(x^0.5)}
\addplot3[colormap/greenyellow,
surf,
shader=faceted interp,
samples=30,
domain=0:3,
domain y=0:-2*pi,
z buffer=sort,
data cs=polarrad along x]
({\generatrix},y,x);
\addplot3[
surf,
samples=30,
domain=1.5:1.6,
domain y=0:-2*pi,
z buffer=sort,
data cs=polarrad along x]
({\generatrix},y,x);
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
% This creates a color gradient for the filled area of the two functions
\pgfdeclareverticalshading{brighter}{100bp}{
rgb(0bp)=(0.1,0.55,0);
rgb(100bp)=(0.8,0.9,0)
}
%
\pgfdeclareverticalshading{darker}{100bp}{
rgb(0bp)=(0.5,0.75,0);
rgb(100bp)=(0,0.5,0)
}
%
\begin{axis}[axis lines=middle,
title={},
view={90}{0},
colormap name=myblack]
\def\generatrix{(x^0.5)}
\addplot3[colormap/greenyellow,
surf,
shader=faceted interp,
samples=30,
domain=0:3,
domain y=0:-2*pi,
z buffer=sort,
data cs=polarrad along x]
({\generatrix},y,x);
\addplot3[
surf,
samples=30,
domain=1.5:1.6,
domain y=0:-2*pi,
z buffer=sort,
data cs=polarrad along x]
({\generatrix},y,x);
\end{axis}
\end{tikzpicture}
\end{document}
答案1
开源渐近线和媒体9包很好地结合起来,实现了这一点。从 asymptote 文件开始查尔斯·斯塔茨:
// code from https://tex.stackexchange.com/a/228963/121799
import graph3;
size(400,400,IgnoreAspect);
currentprojection=orthographic(4,4.1,2);
defaultrender.merge=true;
defaultpen(0.5mm);
//Draw the surface z^2 - x^2 - y^2=1
triple f(pair t) {
return (cos(t.y)*tan(t.x), sin(t.y)*tan(t.x),1/cos(t.x));
}
surface s=surface(f,(-1,0),(1,2*pi),32,16,
usplinetype=new splinetype[] {notaknot,notaknot,monotonic},
vsplinetype=Spline);
pen p=rgb(0,0,.7);
draw(s,rgb(.6,.6,1)+opacity(.7),meshpen=p);
我们可以用这个命令把它编译成一个 prc 文件:
asy -prc -outformat prc asyfile.asy
然后我们可以使用 tex 源
\documentclass{article}
\usepackage{media9}
\begin{document}
\includemedia[
width=0.8\linewidth,height=0.8\linewidth,
add3Djscript=asylabels.js, %upright text labels
add3Djscript=3Dspintool.js, %let scene rotate about z-axis
3Dmenu,
3Dc2c=.37 -.72 -.58, % magic numbers
3Dcoo=109 -199 188, % magic numbers
3Droo=499, % magic number
]{alternate output}{asyfile.prc}
\end{document}
然后使用支持 prc 格式的 pdf 查看器(据我所知,只有 Adobe 的),您可以通过单击“替代输出”(信任文档并再次单击)与生成的 pdf 进行交互。您要做的第一件事之一就是找到神奇的数字。摆弄交互式图像,直到它看起来正确,然后右键单击图像并选择“获取当前视图”。这将打开 javascript 控制台,其中包含数字供您复制和粘贴。
您可能还想做的另一件事是获得比“替代输出”更好的东西。最有可能的是,您希望将\includegraphics
同一幅图像用作静态 pdf,可以使用
asy -noprc -outformat pdf asyfile.asy
另一种可能性创建,即将同一幅图像用作静态 png,它来自
asy -noprc -outformat png -render 4 asyfile.asy
完成所有这些操作后,您需要随身携带一份渐近线文档或教程。文档可在渐近线网站上找到;Marmot 找到了Charles Staats 的精彩教程也一样。