答案1
\documentclass[tikz,border=3.14pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{colormaps}
\begin{document}
\foreach \X in {0,...,14}
{\begin{tikzpicture}
\begin{axis}[view/h=45,axis lines = none,colormap={fake}{
rgb255(0cm)=(255,255,255); rgb255(1cm)=(255,255,255); rgb255(2cm)=(255,0,0);
rgb255(3cm)=(255,0,0)},unit vector ratio=1 1 1]
\addplot3[domain=0:360,domain y=0:360,point meta=x-y+z,mesh,
z buffer=sort]
({(1+cos(x+\X))*cos(y+\X)},
{(1+cos(x+\X))*sin(y+\X)},
{sin(x+\X)});
\end{axis}
\path (1,1) rectangle (5.9,4.7); % <- Thanks to J Leon V. !
\end{tikzpicture}}
\end{document}
更新:消除了闪烁,非常感谢 J Leon V.!并且移除了amsmath
包装并稍微改变了视图。
答案2
只是为了发现,Asymptote 中的一个选项,我试图找到一种方法来控制样条笔的颜色,但我什么也没找到,手册很暗,有了这个代码你可以根据问题得到渲染,也就是绘制圆环,创建渐近线的文件,允许旋转生成的图形,只要它是通过支持 3d 的 pdf 阅读器,比如 Acrobat。
动画是一个单独的工作,因为它与 tikz 在独立环境中使用 foreach 的方法不同,因此动画是通过生成 15 个文件并将它们放在一个 pdf 中,然后使用它们进行处理来手动完成的。图像魔法转换器。
梅威瑟:
% arara: pdflatex: {synctex: yes, action: nonstopmode, shell: yes}
% arara: asymptote
% arara: pdflatex: {synctex: yes, action: nonstopmode, shell: yes}
\documentclass[border=20pt]{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}
import graph3;
size(400,0);
currentprojection=orthographic(4,0,2);
real R=10;
real a=10;
real D=15*pi/180;
triple f(pair t) {
return ((R+a*cos(t.y+D))*cos(t.x+D),(R+a*cos(t.y+D))*sin(t.x+D),a*sin(t.y+D));
}
pen p=rgb(1,0,0)+thick();
surface s=surface(f,(0,0),(2pi,2pi),24,24,Spline);
draw(s,surfacepen=material(white+opacity(0.8),
ambientpen=white),meshpen=p);
\end{asy}
\end{document}
PSD:由于我使用了文档类,所以无法避免闪烁standalone
,文档类会根据渲染的内容剪切画布,而且当旋转时它会发生变化,我认为可以使用包来解决geometry
。
更新:避免动画中出现闪烁...
% PROCESADOR ARARA V3.0
% arara: pdflatex: {synctex: yes, action: nonstopmode, shell: yes}
% arara: asymptote
% arara: pdflatex: {synctex: yes, action: nonstopmode, shell: yes}
\documentclass[a5paper]{article}
\usepackage{pdflscape}
\usepackage[
left=60pt,
right=0pt,
top=0pt,
bottom=0pt,
foot=0pt
]{geometry}
\usepackage{asymptote}
\begin{document}
\pagestyle{empty}
\begin{landscape}
\centering
\begin{asy}
import graph3;
size(500,300);
currentprojection=orthographic(4,0,2);
real R=10;
real a=10;
real D=15*pi/180;
triple f(pair t) {
return ((R+a*cos(t.y+D))*cos(t.x+D),(R+a*cos(t.y+D))*sin(t.x+D),a*sin(t.y+D));
}
pen p=rgb(1,0,0)+thick();
surface s=surface(f,(0,0),(2pi,2pi),24,24,Spline);
draw(s,surfacepen=material(white+opacity(0.8),
ambientpen=white),meshpen=p);
\end{asy}
\end{landscape}
\end{document}
更新动画:
关于 meshpen 的颜色和不透明度:
使用调色板模块:对于表面,我们有s.colors(palette(s.map(xpart),Gradient(color1,....colorx))
根据 x 位置改变表面颜色;对于笔,不会有任何类似的属性吗?例如p=unknown_macro(palette(p.map(xpart), Gradient(color1,..., colorx))
;而不是对于 pgplotscolormap
在土拨鼠的答案是,如果可以使用网格来实现,那么问题在于网格不是像 Asymptote 中的样条曲线那样的曲线类型。对于表面,即使有不透明度,它也能工作,如以下测试示例:
测试MWE:
% PROCESADOR ARARA V3.0
% arara: pdflatex: {synctex: yes, action: nonstopmode, shell: yes}
% arara: asymptote
% arara: pdflatex: {synctex: yes, action: nonstopmode, shell: yes}
\documentclass[a5paper]{article}
\usepackage{pdflscape}
\usepackage[
left=60pt,
right=0pt,
top=0pt,
bottom=0pt,
foot=0pt
]{geometry}
\usepackage{asymptote}
\begin{document}
\pagestyle{empty}
\begin{landscape}
\centering
\begin{asy}
import graph3;
import palette;
size(500,300);
currentprojection=orthographic(0,-2,1);
real R=10;
real a=10;
real D=15*pi/180;
triple f(pair t) {
return ((R+a*cos(t.y+D))*cos(t.x+D),(R+a*cos(t.y+D))*sin(t.x+D),a*sin(t.y+D));
}
pen p=rgb(0,0,0)+thick();
surface s=surface(f,(0,0),(2pi,2pi),24,24,Spline);
s.colors(palette(s.map(xpart),Gradient(red,purple,blue,green+opacity(0.7),green+opacity(0.2))));
draw(s,meshpen=p,render(merge=true));
\end{asy}
\end{landscape}
\end{document}
答案3
我通常不会发布两个答案,但不知何故,我觉得应该指出,让渐近线中的圆环淡出或制作动画都没有问题。如果@J.LeonV 将这些元素添加到她/他的答案中,我很乐意删除它。我只是不想让读者觉得渐近线有重大缺陷,但我认为它没有。
\documentclass[border=5pt]{standalone}
% using Charles Staats' tutorial: https://math.uchicago.edu/~cstaats/Charles_Staats_III/Notes_and_papers_files/asymptote_tutorial.pdf
% https://tex.stackexchange.com/a/339046/121799 for the plane
% https://tex.stackexchange.com/a/339046/121799 for the animation
% and https://tex.stackexchange.com/a/435341/121799 for the torus parametrization
\usepackage{filecontents}
\begin{filecontents*}{horntorus.asf}
\begin{asypicture}{name=horntorus}
settings.render = 8;
settings.prc = false;
settings.outformat = "pdf";
import graph3;
import contour;
size3(8cm);
real rotangle = @myangle;
currentprojection = orthographic(10,1,4);
defaultrender = render(merge = true);
real R=2;
real a=2;
real D=15*pi/180;
triple f(pair t) {
return ((R+a*cos(t.y+D))*cos(t.x+D),(R+a*cos(t.y+D))*sin(t.x+D),a*sin(t.y+D));
}
path3 vcircle(real vx){
triple fx(real t) {
return f((t,vx*D));
}
return graph(fx, 0, 2*pi, operator ..);
}
path3 hcircle(real vx){
triple fy(real t) {
return f((vx*D,t));
}
return graph(fy, 0, 2*pi, operator ..);
}
for (int irun=1; irun<=24;irun+=1)
{
draw(vcircle(irun+rotangle), p=red);
draw(hcircle(irun+rotangle), p=red);
}
real Rad=2*R;
path3 plane = Rad*sqrt(2)*Y+Rad*Z -- Rad*sqrt(2)*Y-Rad*Z --
-Rad*sqrt(2)*Y-Rad*Z -- -Rad*sqrt(2)*Y+Rad*Z -- cycle;
surface cheatplane = surface(plane);
for (int irun=0; irun<=10;irun+=1)
{
draw(shift((0.2-0.25*irun)*(X))*rotate(-45,Y)*cheatplane,white+opacity(0.1*irun),light=nolight);
}
\end{asypicture}
\end{filecontents*}
\usepackage{pgffor}
\usepackage{asypictureB}
\standaloneenv{asypicture}
\begin{document}
\foreach \X [count=\n,evaluate={\myangle=\X/24)}] in {1,...,24}
{
\RequireAsyRecompile
\input{horntorus.asf}
}
\end{document}
我让圆环逐渐消失的方法是将具有一定不透明度的白色平面放在正确的位置。Asymptote 真正酷的地方在于它有一个 3D 引擎,因此实现起来非常容易。