Как создать узлы на разных сетках, соединенные стрелками?

Как создать узлы на разных сетках, соединенные стрелками?

Я новичок в tikz. Я пытаюсь воссоздать картинку ниже (особенно цепочку сверху слева, сверху справа, снизу справа). Я начал так:

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

Я нахожу эту задачу сложной. Я не хочу отслеживать так много координат. Нужно ли мне использовать библиотеку позиционирования? Могу ли я использовать системы координат относительно разных точек? Или я могу сделать отдельные tikz-изображения и соединить их стрелкой?

Поскольку мне нужно сделать еще несколько изображений такого типа, меня интересует наиболее простое в обслуживании идиоматическое решение.

тензорные сети

Мой результат на данный момент:

что я имею на данный момент

решение1

Для фрагментов кода tikz, которые часто используются повторно, стоит определить picsстиль. Затем код можно нарисовать с помощью \draw (0,0) pic{<pics name>};. Подробнее об этом можно прочитать в разделе 18.2 руководства tikz (версия 3.0.1a). После того, как вы определили пиктограммы для повторяющихся компонентов ваших диаграмм, их относительно просто разместить там, где вам нужно, с помощью \foreachциклов.

Действуя таким образом, вы можете получить следующие два изображения:

введите описание изображения здесь

используя код:

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

Обратите внимание, что координаты внутри picsкоманд указаны относительно того, где picнаходится . picsКоманды также могут принимать аргументы (см., например,Простой рисунок с TikZ).

Связанный контент