使用pgfplots
,我绘制了一个圆环,其表面有一个结:
\begin{tikzpicture}
\begin{axis}[axis equal image]
\addplot3[domain=0:360, y domain=0:360, samples=20, surf, z buffer=sort]
(
{(2 + cos(x))*cos(y)},
{(2 + cos(x))*sin(y)},
{sin(x)}
);
\addplot3[domain=0:360, samples=50]
(
{(2 + cos(2*x))*cos(3*x)},
{(2 + cos(2*x))*sin(3*x)},
{sin(2*x)}
);
\end{axis}
\end{tikzpicture}
然而,事实证明结点显示不正确,因为应该被表面隐藏的部分并没有被隐藏。它应该看起来像这样:
我尝试的第一件事就是为结的图形添加一个z buffer=sort
键,然而,这只会弄乱曲线。我猜问题是圆环和结必须以某种方式相互了解才能z buffer=sort
工作,但没有好的方法可以做到这一点。
还有其他方法吗?我愿意尝试非pgfplots
解决方案。
答案1
这是一个提议,但这不是我的提议。它是这个答案和这个答案。我个人喜欢使用asypictureB
第二个答案的作者。例如,您可以使用 来编译它pdflatex -shell-escape
。
\documentclass[margin=3.14mm]{standalone}
\usepackage{asypictureB}
\begin{document} % based on https://tex.stackexchange.com/a/149759/121799 and
% https://tex.stackexchange.com/a/149784/121799
\begin{asypicture}{name=torus}
import graph3;
size(200,0);
currentprojection=orthographic(4,0,2);
//inner radius
real R=2;
//outer radius
real a=0.75;
//surface:
triple f(pair t) {
return ((R+a*cos(t.y))*cos(t.x),(R+a*cos(t.y))*sin(t.x),a*sin(t.y));
}
//path:
real x(real t) {return cos(t*3)*(R + a*cos(t));}
real y(real t) {return sin(t*3)*(R + a*cos(t));}
real z(real t) {return a*sin(t);}
pen p=blue+opacity(0.33);
// make surface and path
surface s=surface(f,(0,0),(2pi,2pi),8,8,Spline);
path3 q=graph(x,y,z,0,6*pi,operator ..);
// draw surface and path
draw(s,surfacepen=material(diffusepen=blue+opacity(0.33), emissivepen=blue));
real linewidth = 2pt;
draw(q, p=linewidth + orange);
\end{asypicture}
\end{document}
当然,你也可以对路径的不同部分使用不同的颜色。如果有问题,请告诉我,或者我应该删除这个答案,因为与市场上已有的答案相比,它并没有代表任何真正的进步。