곡선 화살표로 일반 폴리의 꼭지점을 연결합니다.

곡선 화살표로 일반 폴리의 꼭지점을 연결합니다.

원 주위에 고르게 분포된 노드 집합인 다이어그램이 있습니다. 원형 화살표로 노드를 어떻게 연결할 수 있나요?

예를 들어, 각 꼭지점에 노드가 있는 오각형이 있다고 가정합니다. 분명히 오각형의 꼭지점은 모두 원 위에 놓여 있습니다. 원과 "평행"인 화살표로 노드를 연결하고 싶습니다. (그래서 전체적으로 사이클처럼 보입니다)

답변1

가능성은 다음과 같습니다. 유형의 두 노드를 사용하여 regular polygon하나는 내부이고 다른 하나는 외부이며 둘 다 원에 배치됩니다.

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\newcommand{\polygonsides}{5}

\begin{document}
\begin{minipage}[t][0.3\textheight]{0.45\textwidth}
Clockwise [option \texttt{bend left}]:
\begin{flushleft}
\begin{tikzpicture}
% Internal cirlce with polygon
\draw[blue](0,0)circle(1.5cm);
\node[regular polygon, regular polygon sides=\polygonsides, minimum size=3cm, draw, name=x] at (0,0) {};
% Nodes on vertices
\foreach \corner in {1,2,...,\polygonsides}
\node[circle,ball color=blue] at (x.corner \corner){};

% External polygon
\node[regular polygon, regular polygon sides=\polygonsides, minimum size=4cm, draw=none, name=p] at (0,0) {};
% Invisible nodes on vertices
\foreach \corner in {1,2,...,\polygonsides}
\node at (p.corner \corner){};

% Connections
\foreach \source/\destination in {p.corner 1/p.corner 5,p.corner 5/p.corner 4,p.corner 4/p.corner 3,p.corner 3/p.corner 2,p.corner 2/p.corner 1}
\draw[-stealth,shorten <=0.2cm,shorten >=0.2cm,thick,blue](\source)to[bend left](\destination);
\end{tikzpicture}
\end{flushleft}
\end{minipage} 
\begin{minipage}[t][0.3\textheight]{0.55\textwidth}
Counterclockwise [option \texttt{bend right}]:
\begin{flushleft}
\begin{tikzpicture}
% Internal cirlce with polygon
\draw[red](0,0)circle(1.5cm);
\node[regular polygon, regular polygon sides=\polygonsides, minimum size=3cm, draw, name=x] at (0,0) {};
% Nodes on vertices
\foreach \corner in {1,2,...,\polygonsides}
\node[circle,ball color=red] at (x.corner \corner){};

% External polygon

\node[regular polygon, regular polygon sides=\polygonsides, minimum size=4cm, draw=none, name=p] at (0,0) {};

% Nodes on vertices
\foreach \corner in {1,2,...,\polygonsides}
\node at (p.corner \corner){};

% Connections
\foreach \source/\destination in {p.corner 1/p.corner 2,p.corner 2/p.corner 3,p.corner 3/p.corner 4,p.corner 4/p.corner 5,p.corner 5/p.corner 1}
\draw[-stealth,shorten <=0.2cm,shorten >=0.2cm,thick,red](\source)to[bend right](\destination);
\end{tikzpicture}
\end{flushleft}
\end{minipage} 
\end{document}

결과:

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

외부 다각형은 화살표의 시작점과 끝점인 정점을 적절하게 설정하기 위한 참조로만 사용되므로 그려지지 않습니다. 물론, 이 외부 다각형에 대해 더 가까운 반경을 선언하여 화살표를 다각형에 더 가깝게 만드는 것이 가능합니다. 이제 거리는 입니다 1cm. 다음에는 두 가지 예가 있습니다. 첫 번째 화살표는 시계 방향이고 두 번째 화살표는 시계 반대 방향입니다. 이 두 가지를 달성하려면 다음이 필요합니다.

  • bend left시계 방향 및 시계 반대 방향에 대한 옵션을 사용합니다 bend right.
  • source/destination노드는 정점이 시계 반대 방향 순서로 번호가 매겨져 있다는 점을 염두에 두고 시계 방향 또는 시계 반대 방향으로 쌍을 연결합니다 .

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

답변2

컴팩트 버전(이것이 무엇인지 확실하지 않기 때문에 둘레 계산을 자동화하지 않았습니다)

\documentclass[border=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,decorations.markings}

\begin{document}
\begin{tikzpicture}[decoration={
    markings,
    mark=between positions 0 and 1 step 2.51376 cm with {\arrow{latex}}
    }
]
\draw[postaction={decorate}] (90:2cm) arc (-270:90:2cm);
\node[draw,red,regular polygon, regular polygon sides=5,minimum height=4cm] {};
\end{tikzpicture}
\end{document}

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

답변3

다음에서는 다각형의 변 수에 관계없이 일반적인 솔루션을 얻을 수 있도록 shapes.geometric모양을 정의하는 라이브러리를 사용합니다. 또한 동일한 노드의 두 앵커 사이의 길이를 계산하는 regular polygon보조 매크로가 필요합니다 .\pgfmathsetlenghtbetweenanchors

호를 그리려면 주어진 구문을 사용합니다.여기언급한 대로 두 모서리 사이의 각도가 필요합니다.여기.

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

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\begin{document}

\makeatletter
\def\pgfmathsetlenghtbetweenanchors#1#2#3#4{%
  % #1: length
  % #2: node
  % #3: first anchor
  % #4: second anchor
  \pgfpointdiff{%
    \pgfpointanchor{#2}{#3}}{%
    \pgfpointanchor{#2}{#4}}%
  \pgfmathparse{veclen(\pgf@x,\pgf@y)}%
  #1=\pgfmathresult pt}
\makeatother

\newlength\nagonradius

\begin{tikzpicture}
  \def\nsides{5}%
  \node[regular polygon,
        regular polygon sides = \nsides,
        draw,
        rotate=25,
        minimum size = 3cm] (\nsides-agon) {};

  \pgfmathsetlenghtbetweenanchors\nagonradius{\nsides-agon}{center}{%
    corner 2}% 
  \foreach \n [remember = \n as \m (initially \nsides)] in
    {1,...,\nsides} {%
      \pgfmathanglebetweenpoints{%
        \pgfpointanchor{\nsides-agon}{center}}{%
        \pgfpointanchor{\nsides-agon}{corner \m}}%
      \let\anglem\pgfmathresult
      \pgfmathanglebetweenpoints{%
        \pgfpointanchor{\nsides-agon}{center}}{%
        \pgfpointanchor{\nsides-agon}{corner \n}}%
      \let\anglen\pgfmathresult
      \ifdim\anglen pt < \anglem pt
        \pgfmathparse{\anglen + 360}%
        \let\anglen\pgfmathresult
      \fi
      \draw[->,red] ([shift={(\anglem:\nagonradius)}]\nsides-agon.center) arc
        (\anglem:\anglen:\nagonradius);} 

\end{tikzpicture}

\begin{tikzpicture}
  \def\nsides{7}%
  \node[regular polygon,
        regular polygon sides = \nsides,
        draw,
        rotate=25,
        minimum size = 3cm] (\nsides-agon) {};

  \pgfmathsetlenghtbetweenanchors\nagonradius{\nsides-agon}{center}{%
    corner 2}% 
  \foreach \n [remember = \n as \m (initially \nsides)] in
    {1,...,\nsides} {%
      \pgfmathanglebetweenpoints{%
        \pgfpointanchor{\nsides-agon}{center}}{%
        \pgfpointanchor{\nsides-agon}{corner \m}}%
      \let\anglem\pgfmathresult
      \pgfmathanglebetweenpoints{%
        \pgfpointanchor{\nsides-agon}{center}}{%
        \pgfpointanchor{\nsides-agon}{corner \n}}%
      \let\anglen\pgfmathresult
      \ifdim\anglen pt < \anglem pt
        \pgfmathparse{\anglen + 360}%
        \let\anglen\pgfmathresult
      \fi
      \draw[->,red] ([shift={(\anglem:\nagonradius)}]\nsides-agon.center) arc
        (\anglem:\anglen:\nagonradius);} 

\end{tikzpicture}


\end{document}

답변4

다음을 사용하는 솔루션은 다음과 같습니다 arc.

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

코드는 다음과 같습니다.

\documentclass{standalone}
\usepackage{tikz}
\pgfmathsetmacro{\radius}{2}
\begin{document}
\foreach \nbn in {3,5,7,9}{
  \begin{tikzpicture}
    \pgfmathsetmacro{\angle}{360/\nbn}
    % center
    \node {\nbn{} nodes};
    % draw nodes
    \foreach \i in {1,...,\nbn}{
      \node at (\angle*\i:\radius) {$N_\i$};
    }
    % draw arrows (clockwise)
    \foreach \i in {1,...,\nbn}{
      \draw[-latex,very thick,red!50!black]
      ({\angle*(\i+.2)}:\radius-.2)
      arc (\angle*(\i+.2):\angle*(\i+1-.2):\radius-.2);
    }

    % draw arrows (anticlockwise)
    \foreach \i in {1,...,\nbn}{
      \draw[-latex,very thick,green!50!black]
      ({\angle*(\i-.2)}:\radius+.2)
      arc (\angle*(\i-.2):\angle*(\i-1+.2):\radius+.2);
    }
  \end{tikzpicture}
}
\end{document}

관련 정보