正多角形の頂点を曲線矢印で接続する

正多角形の頂点を曲線矢印で接続する

円の周りに均等に分散されたノードのセットである単純な図があります。円形の矢印でノードを接続するにはどうすればよいでしょうか?

たとえば、各頂点にノードがある五角形があるとします。明らかに、五角形の頂点はすべて円上にあります。円に「平行」な矢印でノードを接続します。(全体的にはサイクルのように見えます)

答え1

次の可能性が考えられます: タイプのノードを 2 回使用しregular polygon、1 つは内部、もう 1 つは外部で、両方とも円上に配置されます。

\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。次の 2 つの例をご覧ください。最初の例では矢印は時計回りですが、2 番目の例では矢印は反時計回りです。これらを実現するには、次の 2 つが必要です。

  • 時計回りのオプションbend leftbend 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呼ばれるシェイプを定義するライブラリを使用します。また、同じノードの 2 つのアンカー間の長さを計算するregular polygon補助マクロも必要です。\pgfmathsetlenghtbetweenanchors

円弧を描くには、次の構文を使用します。ここそして、前述のように2つの角の間の角度が必要ですここ

ここに画像の説明を入力してください

\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}

関連情報