
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
:
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 \MyFive
desenha a figura básica e atribui nomes aos seus nós usando a string no primeiro argumento e o contador \x
no primeiro \foreach
(por exemplo \MyFive{A}
desenha a figura e nomeia seus nós A-1
, A-2
,..., A-8
). Em seguida, scope
s são usados para deslocar as figuras básicas e \draw
as 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}
O código poderia ser bastante simplificado escolhendo alguns outros nomes para as figuras básicas, permitindo o uso de \foreach
loops adicionais; no entanto, prefiro clareza à brevidade aqui.
Responder2
Buscando brevidade em vez de clareza e explorando o pic
recurso de PGF 3.0
múltiplas foreach
declaraçõ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}
Responder3
Outra tentativa via matrix node
from tikzlibrary
. Primeiro defina a imagem tikz básica como \single
um estilo de duas linhas de conexão - lineS
em vermelho e lineL
em preto, depois coloque todas as imagens no nó da matriz. Desenhe a linha de conexão encontrando a regularidade entre eles e conseguindo por foreach
loop.
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}