
我有一個圖表,它只是一組均勻分佈在一個圓形周圍的節點。如何用圓形箭頭連接節點?
例如,假設我們有一個五邊形,每個頂點都有節點。顯然五邊形的頂點都在圓上。我想透過與圓「平行」的箭頭連接節點。 (所以總的來說它看起來像一個循環)
答案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}