在圆环上画一个结

在圆环上画一个结

使用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}

在此处输入图片描述

当然,你也可以对路径的不同部分使用不同的颜色。如果有问题,请告诉我,或者我应该删除这个答案,因为与市场上已有的答案相比,它并没有代表任何真正的进步。

相关内容