我希望能够使用 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.dtx
TeX-SX 启动板项目因为我添加了一些功能来使其工作。