编辑

编辑

在为一门课程打印一套讲义的过程中,我发现自己需要一张漂亮的照片,环面结,这基本上就是画一条非常复杂的线。通过一些技巧,我能够画出最简单的结,这甚至不是一个真正的结(但这是一个开始......)。代码如下:

\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}

相关内容