兴趣包 - 标签与曲线对齐

兴趣包 - 标签与曲线对齐

我正在尝试标记由包创建的曲线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}

第一张 tikzpicture

第二张 tikzpicture

答案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}

相关内容