在 tikz-graphs 中绘制一圈团簇

在 tikz-graphs 中绘制一圈团簇

我将要绘制一个团环图,其中团中的节点数和团数都是自定义的。

在此处输入图片描述

我的第一个解决方案是使用 tikz-graphs 来绘制团块,但问题是如何围绕中心旋转平铺团块,以及如何添加将团块与路径连接的线,如A)

我可以用以下方式绘制团:

\begin{tikzpicture}
\graph [nodes={draw=none, circle, fill=darkgray}, circular placement, empty nodes, n=8] { subgraph K_n [name=outer] };
\end{tikzpicture}

而对于简单节点的定位,则类似于:

\foreach \s in {22.5,112.5,202.5,292.5}
{
\node[draw, circle, rotate=\s+90,xscale=10.25,yscale=7.25] at (\s:2) {};
}

有效,我不知道如何以这种方式循环 tikz-graphs 宏。

怀特

答案1

根据 OP 的最后一条评论,对于 n>=8,此尝试未寻求帮助,tikz-graph而是为调用的团定义了一个宏,single该宏带有 2 个参数 #1= 环中不同团的标签,#2= 环中团的数量。基本上,此代码使用scope环境以循环方式分配团,并foreach广泛使用循环。

在此处输入图片描述

代码

\documentclass[]{article}  
\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand\single[2]{ % #1=labels, #2= n=number of nodes
\foreach \x in {1,...,#2}{
\pgfmathsetmacro{\ang}{360/#2}
    \pgfmathparse{(\x-1)*\ang}
    \node[draw,fill=red,circle,inner sep=1pt] (#1-\x) at (\pgfmathresult:4cm) {};
  }
  \foreach \x [count=\xi from 1] in {1,...,#2}{
    \foreach \y in {\x,...,#2}{
    \path (#1-\xi) edge[-] (#1-\y);
  }
}
}

\begin{document}
\noindent
\begin{tikzpicture}
\begin{scope}[local bounding box=scope1]
\node at (0,0){$n=4$};
\end{scope}
\foreach \s[count=\si from 0] in {0,45,90,...,360}{
\begin{scope}[shift={($(scope1) +(\s:2)$)}, scale=0.1,rotate=\s+90]
\single{\si}{4};
\end{scope}
}
\foreach \i/\j in {1/2,2/3,3/4,4/5,5/6,6/7,7/8,8/1}
\draw (\i-1)--(\j-3);
\end{tikzpicture}
\begin{tikzpicture}
\begin{scope}[local bounding box=scope1]
\node at (0,0){$n=6$};
\end{scope}
\foreach \s[count=\si from 0] in {0,45,90,...,360}{
\begin{scope}[shift={($(scope1) +(\s:2)$)}, scale=0.1,rotate=\s+30]
\single{\si}{6};
\end{scope}
}
\foreach \i/\j in {1/2,2/3,3/4,4/5,5/6,6/7,7/8,8/1}
\draw (\i-2)--(\j-5);
\end{tikzpicture}

\bigskip

\noindent
\begin{tikzpicture}
\begin{scope}[local bounding box=scope1]
\node at (0,0){$n=8$};
\end{scope}
\foreach \s[count=\si from 0] in {0,45,90,...,360}{
\begin{scope}[shift={($(scope1) +(\s:2)$)}, scale=0.1,rotate=\s+90]
\single{\si}{8};
\end{scope}
}
\foreach \i/\j in {1/2,2/3,3/4,4/5,5/6,6/7,7/8,8/1}
\draw (\i-1)--(\j-5);
\end{tikzpicture}
\begin{tikzpicture}
\begin{scope}[local bounding box=scope1]
\node at (0,0){$n=10$};
\end{scope}
\foreach \s[count=\si from 0] in {0,45,90,...,360}{
\begin{scope}[shift={($(scope1) +(\s:2)$)}, scale=0.1,rotate=\s+90]
\single{\si}{10};
\end{scope}
}
\foreach \i/\j in {1/2,2/3,3/4,4/5,5/6,6/7,7/8,8/1}
\draw (\i-1)--(\j-6);
\end{tikzpicture}

\end{document}

答案2

这是一个具有两个循环的可能解决方案,一个用于创建图形,另一个用于互连。

\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs,graphs.standard}

\tikzset{pic rotate/.store in=\picrotate,
    pic rotate=0,
    graph name/.store in=\grname,
    my clique/.pic={
      \graph [name separator=-,nodes={draw, circle, fill=red,rotate=\picrotate}, circular placement, empty nodes, n=8] { subgraph K_n [name=\grname] };
  }
} 

\begin{document}

\begin{tikzpicture}
\foreach \angle[count=\xi] in {0,45,...,360}{
  \pic [graph name=\xi,pic rotate=\angle] at (\angle:5cm) {my clique};
}
\foreach \x[evaluate=\x as \previousnode using int (\x-1)] in {2,...,9}
\draw(\x-4)--(\previousnode-1);
\end{tikzpicture}

\end{document}

结果:

在此处输入图片描述

相关内容