12

I am learning TikZ in this period, but I have some problems drawing some networks for my thesis. I am trying to draw a network in TikZ which should look similar to the one in this picture:

enter image description here

I have written the following code:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary[topaths]
\newcount\mycount
\begin{document}
\begin{tikzpicture}[transform shape]
  \foreach \x in {1,...,8}{
    \pgfmathparse{(\x-1)*45+floor(\x/9)*22.5}
    \node[draw,circle,inner sep=0.25cm] (N-\x) at (\pgfmathresult:5.4cm) {};
  }

  \foreach \x [count=\xi from 1] in {1,...,8}{
    \foreach \y in {\x,...,8}{
    \path (N-\xi) edge[-] (N-\y);
  }
}
\end{tikzpicture}
\end{document}

It draws just one of the cliques of the image. Could you help me drawing the entire network shown in the picture?

Thank you.

0

3 Answers 3

14

The command \MyFive draws the basic figure and assigns names to its nodes using the string in the first argument and the counter \x in the first \foreach (for example \MyFive{A} draws the figure and names its nodes A-1, A-2,...,A-8). Then scopes are used to shift the basic figures and \draw operations draw the lines.

\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\usetikzlibrary[topaths]

\newcommand\MyFive[1]{%
  \foreach \x in {1,...,8}{
    \pgfmathparse{(\x-1)*45+floor(\x/9)*22.5}
    \node[draw,circle,inner sep=2pt] (#1-\x) at (\pgfmathresult:1.5cm) {};
  }

  \foreach \x [count=\xi from 1] in {1,...,8}{
    \foreach \y in {\x,...,8}{
    \path (#1-\xi) edge[-] (#1-\y);
  }
}
}

\begin{document}

\begin{tikzpicture}
\MyFive{A}
\begin{scope}[xshift=4.5cm]
\MyFive{B}
\end{scope}
\begin{scope}[xshift=9cm]
\MyFive{C}
\end{scope}
\begin{scope}[xshift=13.5cm]
\MyFive{D}
\end{scope}

\begin{scope}[yshift=-4.5cm]
\MyFive{E}
\end{scope}
\begin{scope}[xshift=4.5cm,yshift=-4.5cm]
\MyFive{F}
\end{scope}
\begin{scope}[xshift=9cm,yshift=-4.5cm]
\MyFive{G}
\end{scope}
\begin{scope}[xshift=13.5cm,yshift=-4.5cm]
\MyFive{H}
\end{scope}

\begin{scope}[yshift=-9cm]
\MyFive{I}
\end{scope}
\begin{scope}[xshift=4.5cm,yshift=-9cm]
\MyFive{J}
\end{scope}
\begin{scope}[xshift=9cm,yshift=-9cm]
\MyFive{K}
\end{scope}
\begin{scope}[xshift=13.5cm,yshift=-9cm]
\MyFive{L}
\end{scope}

\begin{scope}[yshift=-13.5cm]
\MyFive{M}
\end{scope}
\begin{scope}[xshift=4.5cm,yshift=-13.5cm]
\MyFive{N}
\end{scope}
\begin{scope}[xshift=9cm,yshift=-13.5cm]
\MyFive{O}
\end{scope}
\begin{scope}[xshift=13.5cm,yshift=-13.5cm]
\MyFive{P}
\end{scope}

\draw (A-7) -- (E-3);
\draw (A-8) -- (F-4);
\draw (A-1) -- (B-5);
\draw (E-2) -- (B-6);
\draw (E-1) -- (F-5);
\draw (B-7) -- (F-3);

\draw (C-7) -- (G-3);
\draw (C-8) -- (H-4);
\draw (C-1) -- (D-5);
\draw (G-2) -- (D-6);
\draw (G-1) -- (H-5);
\draw (D-7) -- (H-3);

\draw (I-7) -- (M-3);
\draw (I-8) -- (N-4);
\draw (I-1) -- (J-5);
\draw (M-2) -- (J-6);
\draw (M-1) -- (N-5);
\draw (J-7) -- (N-3);

\draw (K-7) -- (O-3);
\draw (K-8) -- (P-4);
\draw (K-1) -- (L-5);
\draw (O-2) -- (L-6);
\draw (O-1) -- (P-5);
\draw (L-7) -- (P-3);

\draw (F-8) -- (K-4);
\draw (G-6) -- (J-2);
\end{tikzpicture}

\end{document}

enter image description here

The code could be greatly simplified by choosing some other names for the basic figures allowing to use additional \foreach loops; however, I prefer clarity over brevity here.

9

Going for brevity over clarity and exploiting the pic feature of PGF 3.0 and multiple foreach statements:

\documentclass[tikz,border=5]{standalone}
\tikzset{pics/clique/.style={
  code={
    \foreach \i in {1,...,8}
      \node [circle, draw] (n-#1-\i) at (\i*45-45:2) {};
    \foreach \i [evaluate={\k=int(\i+1);}] in {1,...,7}
      \foreach \j in {\k,...,8}
        \draw (n-#1-\i) -- (n-#1-\j);
  }
}}
\begin{document}
\begin{tikzpicture}
\foreach \x in {1,...,4}
  \foreach \y in {1,...,4}
    \path (\x*6,\y*6) pic {clique={\x-\y}};    
\draw \foreach \a/\b [evaluate={\c=int(\a+1); \d=int(\b+1);}] in {1/1, 3/1, 1/3, 3/3}{ 
    (n-\a-\b-2) -- (n-\c-\d-6) (n-\a-\b-3) -- (n-\a-\d-7)
    (n-\a-\b-1) -- (n-\c-\b-5) (n-\c-\b-3) -- (n-\c-\d-7)
    (n-\c-\b-4) -- (n-\a-\d-8) (n-\a-\d-1) -- (n-\c-\d-5)
  }
  (n-2-2-2) -- (n-3-3-6) (n-3-2-4) -- (n-2-3-8);
\end{tikzpicture}
\end{document} 

enter image description here

5

Another attempt via matrix node from tikzlibrary. First define the basic tikz image as \single and two conntecting line style -- lineS in red and lineL in black, then put all images in the a matrix node. Draw the connecting line by finding the regularity among them and achieved by foreach loop.

enter image description here

Code

\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{topaths,matrix}
\begin{document}

\def\single{
\begin{tikzpicture}[scale=0.3]
\foreach \x in {1,...,8}{
    \pgfmathparse{(\x-1)*45+floor(\x/9)*22.5}
    \node[draw,circle,inner sep=0.25cm] (N-\x) at (\pgfmathresult:5.4cm) {};
  }
  \foreach \x [count=\xi from 1] in {1,...,8}{
    \foreach \y in {\x,...,8}{
    \path (N-\xi) edge[-] (N-\y);
  }
}
\end{tikzpicture}
}
\tikzset{
lineL/.style={draw, shorten >=-29pt,shorten <=-29pt,},
lineS/.style={draw, red, shorten >=-4pt,shorten <=-4pt}
}

\begin{tikzpicture}[auto]
% Place nodes with matrix nodes
 \matrix[matrix of nodes, column sep=1cm, row sep=1cm]{%
    \node [] (A) {\single};  & \node [] (B) {\single};  & \node [] (C) {\single};  &       \node [] (D) {\single};\\
    \node [] (A1) {\single}; & \node [] (B1) {\single}; & \node [] (C1) {\single}; &       \node [] (D1) {\single};\\
    \node [] (A2) {\single}; & \node [] (B2) {\single}; & \node [] (C2) {\single}; &       \node [] (D2) {\single};\\
    \node [] (A3) {\single}; & \node [] (B3) {\single}; & \node [] (C3) {\single}; &       \node [] (D3) {\single};\\
};
% Draw edges
    \foreach \c in{A,B,C,D}{
    \foreach \f/\t in {{}/1,2/3}
{
    \path [lineS] (\c\f) -- (\c\t); 
}
};
  \foreach \c/\d in{A/B,C/D,A1/B1/,C1/D1,A2/B2,C2/D2,A3/B3/,C3/D3}{
    \path [lineS] (\c.0) -- (\d.180);
};

\foreach \f/\t in {A/B1,C/D1,B1/C2,A2/B3,C2/D3}
{
    \path [lineL] (\f.-45) -- (\t.135) ; 
};
\foreach \f/\t in {B/A1,D/C1,C1/B2,B2/A3,D2/C3}
{
    \path [lineL] (\f.-135) -- (\t.45) ; 
};
\end{tikzpicture}
\end{document}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .