在为一门课程打印一套讲义的过程中,我发现自己需要一张漂亮的照片,环面结,这基本上就是画一条非常复杂的线。通过一些技巧,我能够画出最简单的结,这甚至不是一个真正的结(但这是一个开始......)。代码如下:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=2]
\draw (-3.5,0) .. controls (-3.5,1.2) and (-1.5,1.5) .. (0,1.5);
\draw[xscale=-1] (-3.5,0) .. controls (-3.5,1.2) and (-1.5,1.5) .. (0,1.5);
\draw[rotate=180] (-3.5,0) .. controls (-3.5,1.2) and (-1.5,1.5) .. (0,1.5);
\draw[yscale=-1] (-3.5,0) .. controls (-3.5,1.2) and (-1.5,1.5) .. (0,1.5);
\draw (-2,.2) .. controls (-1.5,-0.05) and (-1,-0.15) ..
(0,-.15) .. controls (1,-0.15) and (1.5,-0.05) .. (2,0.2);
\draw (-1.7,0.1) .. controls (-1.5,0.15) and (-1,0.25) ..
(0,.25) .. controls (1,0.25) and (1.5,0.15) .. (1.7,0.1);
\begin{scope}[rotate=10]
\draw[draw=none] (0,-1.32) arc (270:630:3.06cm and 1.32cm)
coordinate[pos=0.375] (a) coordinate[pos=0.875] (b);
\draw[red] (0,-1.32) arc (270:405:3.06cm and 1.32cm);
\draw[red,densely dashed] (a) arc (45:225:3.06cm and 1.32cm);
\draw[red] (b) arc (225:270:3.06cm and 1.32cm);
\end{scope}
\end{tikzpicture}
\end{document}
输出为:
然而,我也对能够绘制非平凡结的图像很感兴趣,比如一个环,它沿着一个方向绕了三圈,同时“绕着洞转”了一次,而我的方法并不具有普遍性。因此,我的问题是:是否有可能有效地制作出这样的图片(人们也可以想到自然概括,例如任意属表面上的线),使用 TikZ我应该补充一点,我已经有一种有效地生成任何(紧凑)可定向曲面(无边界,达到同伦等价---我正在为代数拓扑类输入笔记)图像的方法:只是我不知道如何快速绘制它们上面的线条。
这是一个相关但更简单的问题(不是重复的)。
答案1
这种方法检查法线向量是否指向你的眼睛——如果是,它就画出实线。
编辑
请使用 XeLaTeX 编译它!或者可以用“安全”的拉丁字母替换 csnames 中的希腊字母。
\documentclass[border=9,tikz]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{decorations}
\begin{document}
\foreach\j in{10,20,...,360}{
\tdplotsetmaincoords{30}{\j}
\def\R{5}
\def\r{2}
\def\N{2}
\def\n{3}
\pgfmathsetmacro\S{30*\N*\n}
\pgfmathsetmacro\X{sin(-\tdplotmaintheta)*sin(-\tdplotmainphi)}
\pgfmathsetmacro\Y{sin(-\tdplotmaintheta)*cos(-\tdplotmainphi)}
\pgfmathsetmacro\Z{cos(-\tdplotmaintheta)}
\tikz[tdplot_main_coords]{
\path(-10cm,-10cm)(10cm,10cm);
\draw[dashed](\R+\r,0,0)foreach\i in{0,...,\S}{
\pgfextra{
\pgfmathsetmacro\t{360*\N*(\i/\S)}
\pgfmathsetmacro \τ{\n/\N*\t} \pgfmathsetmacro \ι{\N*\t}
\pgfmathsetmacro\rsinτ{\r*sin(\τ)} \pgfmathsetmacro\sinι{sin(\ι)}
\pgfmathsetmacro\rcosτ{\r*cos(\τ)} \pgfmathsetmacro\cosι{cos(\ι)}
}
--({(\rcosτ+\R)*\cosι},{(\rcosτ+\R)*\sinι},\rsinτ)
};
\draw(\R+\r,0,0)foreach\i in{0,...,\S}{
\pgfextra{
\pgfmathsetmacro\t{360*\N*(\i/\S)}
\pgfmathsetmacro \τ{\n/\N*\t} \pgfmathsetmacro \ι{\N*\t}
\pgfmathsetmacro\rsinτ{\r*sin(\τ)} \pgfmathsetmacro\sinι{sin(\ι)}
\pgfmathsetmacro\rcosτ{\r*cos(\τ)} \pgfmathsetmacro\cosι{cos(\ι)}
\pgfmathparse{
\rcosτ*\cosι*\X + \rcosτ*\sinι*\Y + \rsinτ*\Z
}
\ifdim\pgfmathresult pt<0pt
\def\to{--}
\else
\def\to{}
\fi
}
\to({(\rcosτ+\R)*\cosι},{(\rcosτ+\R)*\sinι},\rsinτ)
};
}
}
\end{document}
ASCII 版本:
\documentclass[border=9,tikz]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{decorations}
\begin{document}
\foreach\j in{10,20,...,360}{
\tdplotsetmaincoords{30}{\j}
\def\R{5}
\def\r{2}
\def\N{2}
\def\n{3}
\pgfmathsetmacro\S{30*\N*\n}
\pgfmathsetmacro\X{sin(-\tdplotmaintheta)*sin(-\tdplotmainphi)}
\pgfmathsetmacro\Y{sin(-\tdplotmaintheta)*cos(-\tdplotmainphi)}
\pgfmathsetmacro\Z{cos(-\tdplotmaintheta)}
\tikz[tdplot_main_coords]{
\path(-10cm,-10cm)(10cm,10cm);
\draw[dashed](\R+\r,0,0)foreach\i in{0,...,\S}{
\pgfextra{
\pgfmathsetmacro\t{360*\N*(\i/\S)}
\pgfmathsetmacro \TAU{\n/\N*\t} \pgfmathsetmacro \IOTA{\N*\t}
\pgfmathsetmacro\rsinTAU{\r*sin(\TAU)} \pgfmathsetmacro\sinIOTA{sin(\IOTA)}
\pgfmathsetmacro\rcosTAU{\r*cos(\TAU)} \pgfmathsetmacro\cosIOTA{cos(\IOTA)}
}
--({(\rcosTAU+\R)*\cosIOTA},{(\rcosTAU+\R)*\sinIOTA},\rsinTAU)
};
\draw(\R+\r,0,0)foreach\i in{0,...,\S}{
\pgfextra{
\pgfmathsetmacro\t{360*\N*(\i/\S)}
\pgfmathsetmacro \TAU{\n/\N*\t} \pgfmathsetmacro \IOTA{\N*\t}
\pgfmathsetmacro\rsinTAU{\r*sin(\TAU)} \pgfmathsetmacro\sinIOTA{sin(\IOTA)}
\pgfmathsetmacro\rcosTAU{\r*cos(\TAU)} \pgfmathsetmacro\cosIOTA{cos(\IOTA)}
\pgfmathparse{
\rcosTAU*\cosIOTA*\X + \rcosTAU*\sinIOTA*\Y + \rsinTAU*\Z
}
\ifdim\pgfmathresult pt<0pt
\def\to{--}
\else
\def\to{}
\fi
}
\to({(\rcosTAU+\R)*\cosIOTA},{(\rcosTAU+\R)*\sinIOTA},\rsinTAU)
};
}
}
\end{document}