Conecte los vértices de un poli regular mediante flechas curvas

Conecte los vértices de un poli regular mediante flechas curvas

Tengo un diagrama que es simplemente un conjunto de nodos distribuidos uniformemente alrededor de un círculo. ¿Cómo puedo conectar los nodos con flechas circulares?

por ejemplo, supongamos que tenemos un pentágono con nodos en cada vértice. Obviamente, todos los vértices del pentágono se encuentran en un círculo. Quiero conectar los nodos mediante flechas que sean "paralelas" al círculo. (Así que en general parece un ciclo)

Respuesta1

Aquí hay una posibilidad: usar dos nodos de tipo regular polygon, uno interno y otro externo, ambos colocados sobre círculos.

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

Resultado:

ingrese la descripción de la imagen aquí

El polígono externo no se dibuja porque solo se usa como referencia para establecer correctamente los vértices que son el punto inicial y final de las flechas. Por supuesto, es posible hacer que las flechas estén más cerca del polígono declarando un radio más cercano para este polígono externo: ahora la distancia es 1cm. A continuación hay dos ejemplos: en el primero las flechas están en el sentido de las agujas del reloj mientras que en el segundo están en el sentido contrario a las agujas del reloj. Para lograr estas dos cosas son necesarias:

  • usando opciones bend leftpara el sentido de las agujas del reloj y bend rightpara el sentido contrario a las agujas del reloj;
  • conecte el par source/destinationen el sentido de las agujas del reloj o en el sentido contrario a las agujas del reloj teniendo en cuenta que los nodos son vértices y están numerados en el sentido contrario a las agujas del reloj:

ingrese la descripción de la imagen aquí

Respuesta2

Una versión compacta (no automatizó el cálculo de la circunferencia ya que no estoy seguro de si esto es lo que se pide)

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

ingrese la descripción de la imagen aquí

Respuesta3

A continuación, uso la biblioteca shapes.geometricque define una forma llamada regular polygonpara que tengas una solución general sin importar cuántos lados tenga el polígono. También necesito una macro auxiliar \pgfmathsetlenghtbetweenanchorsque calcule la longitud entre dos anclajes del mismo nodo.

Para dibujar el arco, uso la sintaxis dada.aquíy necesito el ángulo entre dos esquinas como se mencionóaquí.

ingrese la descripción de la imagen aquí

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

Respuesta4

Aquí hay una solución usando arc:

ingrese la descripción de la imagen aquí

Y el código:

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

información relacionada