使用 TikZ 或 pgfplots 制作标记的克莱因瓶?

使用 TikZ 或 pgfplots 制作标记的克莱因瓶?

我希望能够使用 LaTeX 在克莱因瓶(三维嵌入)上绘制以下细胞复合结构。我对手绘效果非常满意,但 LaTeX 更漂亮,而且可以编辑。

在此处输入图片描述

我仍在学习中TikZ,之前没有用过这个pgfplots包,所以不知道它是否有帮助。我在网上找到的唯一相关的地方是


编辑:感谢下面 hpesoj626 的有益评论,我已经让 gnuplots 工作了,所以我现在至少可以编译上面的第二个示例(我仍然不知道如何实现第一个示例)。然而,仍然存在以下问题装饰克莱因瓶中含有我想要绘制的各种曲线和点,但两篇文章都没有提到。

此外,从视觉上看,这两种绘图解决方案似乎都太“重”,无法真正使它们以我想要的方式进行标记。我正在寻找一个轮廓更明显的克莱因瓶。如果最终答案是我需要“手工”绘制它(即规划出一个代表克莱因瓶的二维图像),那么请发布您关于如何做到这一点的任何建议。

有人可以建议一种在 LaTeX 中绘制此图的方法吗?

答案1

接下来会进一步解释,目前就这么多:

  • 把你的草图放在节点中
  • 使用绘图命令重新创建线条(我使用了to[in=,out=,looseness=]
  • 删除草图

它远非完美,有些标签缺失。您可以通过添加更多中间点来提高质量。

(最终)代码

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}

\usepackage{tikz}
\usetikzlibrary{scopes,intersections}

\newcommand{\Coordinate}[2]%
{ \coordinate (#1) at (#2);
    %\fill[red] (#2) circle (0.05) node[above] {#1};
}

\begin{document}

\begin{frame}

\begin{tikzpicture}
%   \node[above right,inner sep=0,outer sep=0] (a) {\includegraphics{klein.png}};
%   \draw[orange,thin,dashed,] (a.south west) grid (a.north east);
%   \foreach \x in {0,...,10}{\node [below] at (\x,0) {\x};}
%   \foreach \y in {0,...,12}{\node [left] at (0,\y) {\y};}

    \node[fill=blue,circle,label=0:P1,inner sep=0.5mm] (P1) at (4.9,6.7) {};
    \node[fill=blue,circle,label=270:P2,inner sep=0.5mm] (P2) at (2.5,5.4) {};
    \node[fill=blue,circle,label=45:P3,inner sep=0.5mm] (P3) at (1.6,4) {};
    \Coordinate{e5b}{3.6,1.3}
    \Coordinate{e4l}{0.7,4.8}
    \Coordinate{e4r}{9.9,3.7}
    \Coordinate{si}{4.5,7.4}
    \Coordinate{bottom}{6.8,0.9}

    {[very thick,black]
        \draw (e4l) to[out=270,in=160,looseness=1] (P3);
        \draw (P3) to[out=340,in=270,looseness=0.3] node[above,pos=0.7,black] {$e_4$} (e4r);
        \draw[name path=P2e4r] (P2) to[out=120,in=80,looseness=3.7] node[below left,pos=0.7,black] {$f_2$} (e4r);
        \draw[name path=P1P1] (P1) to[out=160,in=270,looseness=1] (2.6,9) to[out=90,in=90,looseness=1.3] node[above, pos=0.5,black] {$e_3$} (6.6,9.6) to[out=270,in=40,looseness=1]  (P1) ;
        \draw (P2) to[out=315,in=315,looseness=0.5] node[below right,pos=0.5,black] {$e_1$} (P1);
        \draw[dashed] (P2) to[out=135,in=135,looseness=0.5] node[below right,pos=0.5,black] {$f_1$} (P1);
        \draw (P2) to[out=220,in=90,looseness=1] (P3);
        \draw (P3) to[out=270,in=150,looseness=1] (e5b);
        \draw (e4l) to[out=270,in=160,looseness=1.3] (e5b);
        \draw (e5b) to[out=340,in=260,looseness=1.1] (e4r);
        \draw[dashed] (P2) to[out=300,in=330,looseness=1] (e5b);
        \draw[dashed] (e4l) to[out=90,in=90,looseness=0.6] (e4r);
        \draw[dashed] (P1) to[out=320,in=190,looseness=0.4] (bottom);
        \draw (P1) to[out=110,in=300,looseness=1] (si);

        \draw (si) to[out=120,in=270,looseness=1] (4,8.5) to[out=90,in=180,looseness=1] (5.2,9.7) to[out=0,in=90,looseness=1] (6,9) to[out=270,in=20,looseness=1] (si);

        \path[name path=e4lsi] (e4l) to[out=90,in=200,looseness=0.8] (si);
        \draw[name intersections={of=e4lsi and P2e4r}] (e4l) to[out=90,in=210,looseness=1] (intersection-1) coordinate (h1);
        \draw[dashed] (intersection-1) to[out=30,in=200,looseness=0.6] (si);
    }
\end{tikzpicture}

\end{frame}

\end{document}

输出

在此处输入图片描述

答案2

这是 Tom Bombadil 的替代方案,它使用 Hobby 算法通过给定的一组点生成平滑路径(参见使用 Metapost 和 TikZ 通过一系列点绘制曲线)。使用此功能的目的是,它使绘制定义不明确的形状变得更容易,因为您只需继续指定更多点,直到它“看起来正确” - 无需担心松散或类似问题。我认为生成的代码看起来也更干净。

\documentclass{article}
%\url{https://tex.stackexchange.com/q/77606/86}
\usepackage{tikz}
\usetikzlibrary{hobby}

\begin{document}
\begin{tikzpicture}[use Hobby shortcut]
\draw ([closed,blank=soft]0,0)
\foreach \pt in {
  (-2,2),
  (2,2),
  (2,-2),
  (-2,-2),
  ([blank]-2,-1),
  (-1,-1),
  (1,-2),
  ([blank=soft]1,2),
  ([blank=soft]-1,1),
  (-3,3),
  (6,4.5),
  (4.5,-4.5),
  (-2.5,-6)
} {
  .. ++\pt
};
\draw[dashed,use previous hobby path={invert soft blanks}];
\draw (0,0) .. +(-1,-1) .. ++(-2,-1);
\draw[dashed] (0,0) .. +(-1,-.75) .. ++(-2,-1);
\draw (-2.45,-3.9) .. +(3.3,-.75) .. (4.2,-3.95);
\draw[dashed] (-2.45,-3.9) .. +(4.3,.5) .. (4.2,-3.95);
\end{tikzpicture}
\end{document}

结果:

克莱因瓶

请注意,我们实际上绘制了两次路径,但反转了(大部分)哪些部分是空白的(这无法通过后置操作实现,因为它涉及修改实际路径;但当算法运行时,它只会生成点,因此我们可以重复使用该列表,但指定要采取的不同操作)。这使得可以使用相同的规范并以不同的方式绘制内部和外部部分。我的意思是外部里面部分不同。也就是说,里面还有...哦,没关系。

您必须从获取最新版本的爱好代码( hobby.dtx,然后运行)tex hobby.dtxTeX-SX 启动板项目因为我添加了一些功能来使其工作。

相关内容