Desenhando uma rede multiescala em Tikz

Desenhando uma rede multiescala em Tikz

Estou aprendendo TikZ neste período, mas tenho alguns problemas para desenhar algumas redes para minha tese. Estou tentando desenhar uma rede no TikZ que deve ser semelhante à dothis picture:

insira a descrição da imagem aqui

Eu escrevi o seguinte código:

\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}

Desenha apenas um dos cliques da imagem. Você poderia me ajudar a desenhar toda a rede mostrada na imagem?

Obrigado.

Responder1

O comando \MyFivedesenha a figura básica e atribui nomes aos seus nós usando a string no primeiro argumento e o contador \xno primeiro \foreach(por exemplo \MyFive{A}desenha a figura e nomeia seus nós A-1, A-2,..., A-8). Em seguida, scopes são usados ​​para deslocar as figuras básicas e \drawas operações para desenhar as linhas.

\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}

insira a descrição da imagem aqui

O código poderia ser bastante simplificado escolhendo alguns outros nomes para as figuras básicas, permitindo o uso de \foreachloops adicionais; no entanto, prefiro clareza à brevidade aqui.

Responder2

Buscando brevidade em vez de clareza e explorando o picrecurso de PGF 3.0múltiplas foreachdeclarações:

\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} 

insira a descrição da imagem aqui

Responder3

Outra tentativa via matrix nodefrom tikzlibrary. Primeiro defina a imagem tikz básica como \singleum estilo de duas linhas de conexão - lineSem vermelho e lineLem preto, depois coloque todas as imagens no nó da matriz. Desenhe a linha de conexão encontrando a regularidade entre eles e conseguindo por foreachloop.

insira a descrição da imagem aqui

Código

\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}

informação relacionada