Soy principiante en tikz. Estoy intentando recrear la imagen a continuación (especialmente la cadena superior izquierda, superior derecha e inferior derecha). Empecé así:
\documentclass[tikz]{standalone}
\usepackage{amsmath}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\tikzstyle{tensor} = [circle, inner sep = 0pt, minimum size = 0.2cm]
\tikzstyle{QTensor} = [tensor, draw, fill=green!50, minimum size = 0.3cm]
\tikzstyle{delta} = [tensor, draw, fill=red!50, minimum size = 0.4cm]
\tikzstyle{ellipsisNode} = [tensor, minimum size = 0.7cm]
% Draw delta tensors
\foreach \x in {2, 4}
\foreach \y in {2, 4}
\node[delta] (\x-\y) at (\x, \y) {};
% Draw Q tensors
\foreach \x in {1, 3, 5}
\foreach \y in {2, 4}
{
\node[QTensor] (\x-\y) at (\x, \y) {};
\node[QTensor] (\y-\x) at (\y, \x) {};
}
% Draw ellipsis nodes
\foreach \x in {0, 6}
\foreach \y in {2, 4}
{
\node[ellipsisNode] (\x-\y) at (\x, \y) {$\cdots$};
\node[ellipsisNode, rotate = 90] (\y-\x) at (\y, \x) {$\dots$};
}
% Connections
\foreach \x in {0, ..., 5}
\foreach \y in {2, 4}
{
\pgfmathtruncatemacro{\neighbor}{\x + 1};
\draw (\x-\y) -- (\neighbor-\y);
\draw (\y-\x) -- (\y-\neighbor);
}
\end{tikzpicture}
\end{document}
La tarea me resulta desalentadora. No quiero seguir tantas coordenadas. ¿Necesito usar la biblioteca de posicionamiento? ¿Puedo utilizar sistemas de coordenadas relativas a diferentes puntos? ¿O puedo hacer imágenes tikz separadas y unirlas con una flecha?
Como necesito crear varias imágenes más de este tipo, estoy interesado en la solución idiomática más fácil de mantener.
Mi resultado hasta ahora:
Respuesta1
Para fragmentos de código tikz que se reutilizan mucho, vale la pena definir un pics
estilo para ellos. Luego, el código se puede dibujar usando \draw (0,0) pic{<pics name>};
. Puedes leer más sobre esto en la sección 18.2 del manual de tikz (versión 3.0.1a). Una vez que haya definido imágenes para los componentes repetidos de sus diagramas, es relativamente sencillo colocarlas donde desee mediante \foreach
bucles.
Haciéndolo de esta manera puedes producir las siguientes dos imágenes.
usando el código:
\documentclass{article}
\usepackage{tikz}
\tikzset{% define pic styles
pics/array/.style={
code={\draw(-0.6,0)--+(1.2,0);
\draw(0,-0.6)--+(0,1.2);
\draw[fill=red!50] circle[red!50,radius=4pt](0,0);
\foreach \a in {0.5,-0.5} {
\draw[fill=green!50] (0,\a) circle[radius=2pt];
\draw[fill=green!50] (\a,0) circle[radius=2pt];
}
}
},
pics/semiarray/.style={
code={\draw[rounded corners, fill=yellow!20](-0.45,-0.45) rectangle +(0.9,0.9);
\draw(-0.6,0)--+(1.2,0); % draw the "axes" over the top of the shading
\draw(0,-0.6)--+(0,1.2);
\draw[fill=red!50] circle[red!50,radius=4pt](0,0);
\draw[fill=green!50](-0.35,-0.1) -- +(0,0.2) arc(90:-90:0.1) -- cycle; % semicircles
\draw[fill=green!50](0.35,0.1) -- +(0,-0.2) arc(270:90:0.1) -- cycle;
\draw[fill=green!50](-0.1,0.35) -- +(0.2,0) arc(0:-180:0.1) -- cycle;
\draw[fill=green!50](-0.1,-0.35) -- +(0.2,0) arc(0:180:0.1) -- cycle;
}
},
}
\begin{document}
\begin{tikzpicture}
\foreach \x in {0,...,4} {
\draw[dotted](-0.4,\x)--+(-0.5,0);
\draw[dotted](4.4,\x)--+(0.5,0);
\draw[dotted](\x,-0.4)--+(0,-0.5);
\draw[dotted](\x,4.4)--+(0,0.5);
}
\foreach \x in {0,...,4} {
\foreach \y in {0,...,4} {
\draw(\x,\y) pic{array};
}
}
\end{tikzpicture}
\begin{tikzpicture}
\foreach \x in {0,...,4} {
\draw[dotted](-0.4,\x)--+(-0.5,0);
\draw[dotted](4.4,\x)--+(0.5,0);
\draw[dotted](\x,-0.4)--+(0,-0.5);
\draw[dotted](\x,4.4)--+(0,0.5);
}
\foreach \x in {0,...,4} {
\foreach \y in {0,...,4} {
\draw(\x,\y) pic{semiarray};
}
}
\end{tikzpicture}
\end{document}
Observe que las coordenadas dentro de los pics
comandos son relativas al lugar donde pic
se coloca. Los pics
comandos también pueden tomar argumentos (ver, por ejemplo,Dibujo sencillo con TikZ).