Создание процедурно сгенерированных узлов в TikZ

Создание процедурно сгенерированных узлов в TikZ

Я относительно новичок в TiкZ, и я собирал цифры, которые мне нужны для университетских заданий, из различных примеров в Интернете.

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

Вот пример того, какие фигуры я хочу создать:

разделенная сеть

Между ними существует множество узлов и множество связей.

Я могу воспроизвести эту фигуру с помощью TiкZ, размещая каждый узел по отдельности, а затем создавая для каждого отдельное соединение, однако это требует очень много времени, а мне нужно создать еще более крупные фигуры с большим количеством соединений, что займет еще больше времени.

Мне было интересно, какие существуют более разумные способы создания больших фигур со множеством функций, но которые при этом являются достаточно простыми по структуре (например, большая матрица узлов со связями, идущими от каждого узла в столбце к каждому узлу в следующем столбце)?

В некоторых случаях я видел, как люди используют матрицу для позиционирования узлов, а также то, что в Ti можно использовать циклы for и операторы if.кZ тоже, однако перспектива вникать и пытаться понять весь язык TiкZ сам по себе немного пугает, учитывая всю ту работу, которую я пытаюсь выполнить, поэтому, если кто-то знает хорошие примеры или ресурсы, которые могли бы дать хорошую общую информацию о методах, которые могут быть полезны для моих целей, или даже просто советы о том, с чего начать, я буду очень признателен.

решение1

Хотя использование нескольких \foreachциклов делает "семантическую" схему сети немного неясной, это, безусловно, облегчает ее создание. Я допустил некоторые вольности с требуемыми соединениями, иначе сеть начинает выглядеть немного загроможденной.

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{arrows.meta,calc}
\begin{document}
\begin{tikzpicture}[>=Triangle,
   cell/.style={circle, draw},
   connection/.style={shorten >=.125cm, shorten <=.125cm},
]

\foreach \i in {1,...,8}
  \foreach \x [count=\j] in {1,2,5,6,7}
    \node [cell] (cell-\i-\j) at (\x*1.5, \i) {};

\node [cell, draw=none, below=1cm] (cell')  at ($(cell-1-4)!0.5!(cell-1-5)$) {};
\node [cell, draw=none, above=1cm] (cell'') at ($(cell-8-4)!0.5!(cell-8-5)$) {};

\foreach \i in {1,...,8}{
  \foreach \j in {1,3} \draw [->] (cell-\i-\j)++(-1,0) -- (cell-\i-\j);
  \foreach \j in {2,5} \draw [<-] (cell-\i-\j)++(1,0) -- (cell-\i-\j);
}

\foreach \m/\n/\o/\p in {1/4/1/2,5/8/1/2, 3/6/1/2, 1/4/3/4, 5/8/3/4, 3/6/4/5}
  \foreach \i in {\m,...,\n}
    \foreach \j in {\m,...,\n} \draw [connection] (cell-\i-\o) -- (cell-\j-\p);

\foreach \m/\n/\q in {1/2/', 7/8/''}
  \foreach \i in {\m,\n}{
    \draw [connection] (cell-\i-4) -- (cell-\i-5);
    \foreach \j in {4,5} \draw [connection] (cell\q) -- (cell-\i-\j);
  }

\coordinate (@')  at ($(cell') +(5/4,-1/2)$);
\coordinate (@'') at ($(cell'')+(5/4, 1/2)$);
\draw [<->] (cell'.center) |- (@') -- (@'') -| (cell''.center);

\node [above left=.5cm]  at (cell-8-1) {in};
\node [above right=.5cm] at (cell-8-2) {out};

\node [above left=.5cm]  at (cell-8-3) {in};
\node [above right=.5cm] at (cell-8-5) {out};

\draw [Implies-Implies, double, thick, double distance=5pt, 
  shorten >=1.25cm, shorten <=1.25cm] 
  ($(cell-4-2)!0.5!(cell-5-2)$) -- ($(cell-4-3)!0.5!(cell-5-3)$)
  node [midway, above=1cm, font=\large] {?};

\end{tikzpicture}
\end{document}

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

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