
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:
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 left
para el sentido de las agujas del reloj ybend right
para el sentido contrario a las agujas del reloj; - conecte el par
source/destination
en 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:
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}
Respuesta3
A continuación, uso la biblioteca shapes.geometric
que define una forma llamada regular polygon
para que tengas una solución general sin importar cuántos lados tenga el polígono. También necesito una macro auxiliar \pgfmathsetlenghtbetweenanchors
que 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í.
\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
:
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}