호의 서로 다른 모양의 노드 사이에 자동으로 경로 그리기

호의 서로 다른 모양의 노드 사이에 자동으로 경로 그리기

화살표가 모두 "같은 원에" 있는 노드 사이에 화살표를 그리고 싶은 이미지가 있습니다. 다음과 같이 내가 원하는 것을 직접 달성할 수 있습니다.

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes}
\begin{document}
\begin{tikzpicture}[ultra thick, -stealth]
  \node[circle,fill] (a) at (0: 1) {};
  \node[rectangle,minimum width=1cm,fill](b) at (120: 1) {};
  \node[rectangle,minimum height=1cm,fill](c) at (240: 1) {};
  \draw[dashed] (85: 1) arc (85: 30: 1) ;
  \draw (330:1) arc (330: 280:1) ;
  \draw[dashed] (200:1) arc (200: 140:1);
\end{tikzpicture}
\end{document}

하지만 노드의 모양과 크기가 다른 경우에는 수동으로 작동하는 좌표를 찾아야 합니다. 제가 정말로 하고 싶은 것은 노드의 가장자리가 원과 교차하는 위치를 찾아 해당 가장자리를 사용하여 호를 그리는 것입니다. 이를 수행하는 자동 방법이 있습니까?이 답변shorten부분적인 해결책이지만 여전히 호와 길이를 직접 선택해야 할 것 같습니다 .

실제 사용 사례는 노드에 다양한 종횡비의 그림이 포함된다는 것입니다. 나는 어색한 모양의 노드를 사용하여 문제를 근사화했습니다.

답변1

하이코 오버디크의 법칙!!!! --

https://tex.stackexchange.com/a/250270/197451

여기에 이미지 설명을 입력하세요

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{bending}

\begin{document}
    \begin{tikzpicture}[
    ->,   
    thick,
    main node/.style={circle, fill=blue!20, draw},
    ]
    \newcommand*{\MainNum}{5}
    \newcommand*{\MainRadius}{1.5cm} 
    \newcommand*{\MainStartAngle}{90}
    
    % Print main nodes, node names: p1, p2, ...
    \path
    (0, 0) coordinate (M)
    \foreach \t [count=\i] in {A, Hello\\World, 3, foobar, $\cdot$} {
        +({\i-1)*360/\MainNum + \MainStartAngle}:\MainRadius)
        node[main node, align=center] (p\i) {\t}
    }
    ;  
    
    % Calculate the angle between the equal sides of the triangle
    % with side length \MainRadius, \MainRadius and radius of circle node
    % Result is stored in \p1-angle, \p2-angle, ...
    \foreach \i in {1, ..., \MainNum} {
        \pgfextracty{\dimen0 }{\pgfpointanchor{p\i}{north}} 
        \pgfextracty{\dimen2 }{\pgfpointanchor{p\i}{center}}
        \dimen0=\dimexpr\dimen2 - \dimen0\relax 
        \ifdim\dimen0<0pt \dimen0 = -\dimen0 \fi
        \pgfmathparse{2*asin(\the\dimen0/\MainRadius/2)}
        \global\expandafter\let\csname p\i-angle\endcsname\pgfmathresult
    }
    
    % Draw the arrow arcs
    \foreach \i [evaluate=\i as \nexti using {int(mod(\i, \MainNum)+1}]
    in {1, ..., \MainNum} {  
        \pgfmathsetmacro\StartAngle{   
            (\i-1)*360/\MainNum + \MainStartAngle
            + \csname p\i-angle\endcsname
        }
        \pgfmathsetmacro\EndAngle{
            (\nexti-1)*360/\MainNum + \MainStartAngle
            - \csname p\nexti-angle\endcsname
        }
        \ifdim\EndAngle pt < \StartAngle pt
        \pgfmathsetmacro\EndAngle{\EndAngle + 360}
        \fi
        \draw
        (M) ++(\StartAngle:\MainRadius)
        arc[start angle=\StartAngle, end angle=\EndAngle, radius=\MainRadius]
        ;
    }
    \end{tikzpicture}
\end{document}

관련 정보