我正在尝试标记由包创建的曲线hobby
。但是,我无法在水平和垂直方向上正确对齐标签。
在第一幅图像中,我能够使用特定坐标至少进行水平对齐。但是,垂直对齐失败。
第二次tikzpicture
我尝试不用特定坐标而是用节点来标记曲线。再次失败。
感谢您的任何帮助。
\documentclass[tikz]{standalone}
\usetikzlibrary{hobby}
\begin{document}
\begin{tikzpicture}[thick]
% A
\node[orange] (A) at (11,4.58) {A} ;
\draw[orange] (5,4.58) -- (A);
\draw[orange] (-4,7) to[closed,curve through={(-3,-4.58) .. (0,-3) .. (5,4.58)}] (4,7) ;
% B
\node[red] (B) at (11,0.72) {B} ;
\draw[red] (2.0,0.72) -- (B);
\draw[red] (-1,6) to[closed,curve through={(-2,0.72) .. (0,-1) .. (2,0.72)}] (1,6) ;
% C
\node[green] (C) at (11,2) {C} ;
\path (0,2) node[circle,draw,green,minimum size = 1cm](circle) {} ;
\draw[green] (circle) -- (C);
\end{tikzpicture}
\begin{tikzpicture}[thick]
% A
\node[orange] (A) at (11,4.58) {A} ;
\draw[orange] (-4,7) to[closed,curve through={(-3,-4.58) .. (0,-3) .. (5,4.58)}] (4,7) node(a) {} ;
\draw[orange] (a) -- (A);
% B
\node[red] (B) at (11,0.72) {B} ;
\draw[red] (-1,6) to[closed,curve through={(-2,0.72) .. (0,-1) .. (2,0.72)}] (1,6) node(b) {};
\draw[red] (b) -- (B);
% C
\node[green] (C) at (11,2) {C} ;
\path (0,2) node[circle,draw,green,minimum size = 1cm](circle) {} ;
\draw[green] (circle) -- (C);
\end{tikzpicture}
\end{document}
答案1
感觉就像您试图将曲线视为节点的边界。由于您的圆形路径实际上是节点的边界,因此它带有大量信息,以锚点的形式,可用于将其连接到其他事物。普通路径没有这种功能,也无法提供。您的第二段代码将节点放置在曲线上的各个位置,然后将它们连接到标签。由于您没有指定这些节点在曲线上的位置,因此连接线没有必要是水平的。
如果您想将标签放置在特定位置,然后通过水平线将它们连接到曲线,那么最简单的方法是使用库intersections
。在下面的代码中,绘制并命名每条曲线,将每个标签放置在合适的位置,然后定义(但不绘制)水平路径,以便可以找到标签线的正确位置。使用交点库,可以找到该线与曲线连接的位置,然后可以使用这些位置来绘制标签线。
请注意,这里的曲线使用库定义并没有什么特别之处hobby
。任何路径构造都会发生同样的情况。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/648162/86}
\usepackage{tikz}
\usetikzlibrary{hobby,intersections}
\begin{document}
\begin{tikzpicture}[thick,scale=.3]
% A
\node[orange] (A) at (11,5) {A};
\draw[orange,name path=A] (-4,7) to[closed,curve through={(-3,-4.58) .. (0,-3) .. (5,4.58)}] (4,7) ;
\path[name path=AA,overlay] (A) -- +(-20,0);
\draw[name intersections={of=A and AA},orange] (intersection-2) -- (A);
% B
\node[red] (B) at (11,0) {B} ;
\draw[red,name path=B] (-1,6) to[closed,curve through={(-2,0.72) .. (0,-1) .. (2,0.72)}] (1,6) ;
\path[name path=BB,overlay] (B) -- +(-20,0);
\draw[name intersections={of=B and BB},orange] (intersection-2) -- (B);
% C
\node[green] (C) at (11,2.5) {C} ;
\draw[green,name path=C] (0,2) circle[radius=1cm];
\path[name path=CC,overlay] (C) -- +(-20,0);
\draw[name intersections={of=C and CC},green] (intersection-1) -- (C);
\end{tikzpicture}
\end{document}
(我缩小了图像以便它适合该article
类别;显然可以将其删除。)
结果:
答案2
这是一个没有任何花哨的交叉计算的版本(因为使用爱好曲线不容易做到这一点)。
\documentclass[tikz]{standalone}
\usetikzlibrary{hobby,positioning}
\begin{document}
\begin{tikzpicture}[thick]
% A
\draw[orange] (-4,7) to[closed,curve through={(-3,-4.58) .. (0,-3) .. (5,4.58)}] (4,7) coordinate(a);
% B
\draw[red] (-1,6) to[closed,curve through={(-2,0.72) .. (0,-1) .. (2,0.72)}] (1,6) coordinate (b);
% C
\path (0,2) node[circle,draw,green,minimum size = 1cm](circle) {} ;
% Labels
\newcommand{\dist}{8}
\draw[green] (circle) --++ (\dist,0) node[right] (c) {C};
\node[above = 2cm of c,red] (b) {B};
\node[above = 2cm of b,orange] (a) {A};
\draw[red] (b) --++ (-\dist+2.08,0);
\draw[orange] (a) --++ (-\dist+3.74,0);
\end{tikzpicture}
\end{document}