
원 주위에 고르게 분포된 노드 집합인 다이어그램이 있습니다. 원형 화살표로 노드를 어떻게 연결할 수 있나요?
예를 들어, 각 꼭지점에 노드가 있는 오각형이 있다고 가정합니다. 분명히 오각형의 꼭지점은 모두 원 위에 놓여 있습니다. 원과 "평행"인 화살표로 노드를 연결하고 싶습니다. (그래서 전체적으로 사이클처럼 보입니다)
답변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}