Knodel 그래프를 생성하기 위해 TikZ 함수 정의

Knodel 그래프를 생성하기 위해 TikZ 함수 정의

나는 Knodel 그래프를 생성하는 함수를 정의하려고 합니다(아래 그림의 예).

범위를 사용하여 for 루프를 수행하기 위해 TikZ에서 코드가 어떻게 작동하는지, 그리고 인덱스를 사용하여 다른 값을 계산하는 방법을 완전히 잘 모르겠습니다. 또한 함수의 매개변수 값에 따라 가장자리 유형(굵게, 점선 등)을 변경하는 방법을 잘 모르겠습니다.

여기는의사코드TikZ 함수에 대해 다음을 정의하고 싶습니다.

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}[auto, scale=0.9]
\tikzstyle{vertex}=[draw, circle, inner sep=0.55mm]

[declare function={
    %
    %assuming delta and n are both positive integers
    %assuming 1 <= delta <= floor(log base 2 (n))
    %
    knodel(\n, \delta) =
        % make the vertices
        for i in [1, 2]:
            for j in [0, floor(n/2) - 1]:
                \node at (i, j) [vertex] {};

        % make the edges
        for j in [0, floor(n/2) - 1]:
            for k in [0, delta - 1]:
                \draw (1,j) to (2, (j + 2^k - 1) mod floor(n/2));
}]

\draw {knodel(14, 3)}

\end{tikzpicture}
\end{document}

다음은 내가 읽은 논문의 예입니다. 여기에 이미지 설명을 입력하세요

답변1

다음은 두 가지 유형을 정의하는 코드입니다 pics. 하나는 knodel row graph정점을 두 행(OP 이미지에 표시됨)에 배치하고 다른 하나 knodel circle graph는 정점을 원에 배치합니다.

두 사진 모두 각도(정점 수)와 치수(모서리 유형 수)라는 두 가지 인수를 사용합니다.

\documentclass[tikz,border=7pt]{standalone}
% evaluate the parameters from
% #1 = the degree (number of vertices)
% #2 = the dimension (number of edge types)
\def\knodelParameters#1#2{
  \pgfmathsetmacro\m{int(#1/2-1)}
  \pgfmathsetmacro\n{int(2*\m+2)}
  \pgfmathsetmacro\d{int(#2-1)}
}
% place the vertices in two rows y=0 and y=1
\def\knodelRowVertices#1{
  \foreach \i in {0,...,#1}
    \path
      (\i,1) node[vertex,vertex 1/.try](v1\i){} node[above]{(1,\i)}
      (\i,0) node[vertex,vertex 2/.try](v2\i){} node[below]{(2,\i)}
  ;
}
% place the vertices on a circle with radius 2 (if not scaled)
\def\knodelCircleVertices#1{
  \foreach[evaluate={\a=(\i*360)/(#1+1);\b=(\i*360+180)/(#1+1)}] \i in {0,...,#1}
    \path
      (\a:2) node[vertex,vertex 1/.try](v2\i){} (\a:2.5) node{(2,\i)}
      (\b:2) node[vertex,vertex 2/.try](v1\i){} (\b:2.5) node{(1,\i)}
  ;
}
% draw the edges with styles (if defined) dim 0, dim 1, ...
\def\knodelEdges#1#2{
  \foreach[evaluate={\t=2^\k}] \k in {0,...,#2}{
    \foreach[evaluate={\j=int(mod(\i+\t-1,\m+1))}] \i in {0,...,#1}{
      \draw[dim \k/.try] (v1\i) -- (v2\j);
    }
  }
}
\tikzset{
  % two type of pics : "knodel row graph" and "knodel circle graph"
  % ------------------
  pics/knodel row graph/.style args={#1,#2}{
    code={
      \knodelRowVertices{\m}
      \knodelEdges{\m}{\d}
    }
  },
  pics/knodel row graph/.prefix code=\knodelParameters{#1}{#2},
  % ------------------
  pics/knodel circle graph/.style args={#1,#2}{
    foreground code={
      \knodelCircleVertices{\m}
    },
    background code={
      \knodelEdges{\m}{\d}
    }
  },
  pics/knodel circle graph/.prefix code=\knodelParameters{#1}{#2},
  % ------------------
  % two default styles "mono" and "rainbow"
  % ------------------
  vertex/.style={fill,circle,inner sep=1.5pt},
  mono/.style={
    dim 0/.style={very thin},
    dim 1/.style={dotted},
    dim 2/.style=thick
  },
  rainbow/.style={
    vertex 1/.style={red!70!black},
    vertex 2/.style={blue!70!black},
    dim 0/.style={red},
    dim 1/.style={blue},
    dim 2/.style={green},
    dim 3/.style={orange},
    dim 4/.style={purple}
  }
}
\begin{document}
  \begin{tikzpicture}
    \path
      (5,4) pic[rainbow]{knodel row graph={14,3}}
      (0,4) pic[mono]{knodel row graph={8,3}}
      (2,0) pic[mono]{knodel circle graph={8,3}}
      (8,0) pic[rainbow]{knodel circle graph={20,5}}
    ;
  \end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

답변2

\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz-3dplot}

\begin{document}
\tdplotsetmaincoords{70}{110}
\tikz[tdplot_main_coords]{
    \def\nhalf{20}
    \def\Delta{5}
    \def\r{4}
    \def\h{5}
    \foreach\m in{0,...,\numexpr\nhalf-1}{
        \draw(\m*360/\nhalf:\r)node(\m){$\m$}
            +(0,0,\h)node(\m'){$\m'$};
    }
    \foreach\d in{0,...,\numexpr\Delta-1}{
        \foreach\m in{0,...,\numexpr\nhalf-1}{
            \pgfmathtruncatemacro\target{mod(\m+\d,\nhalf)}
            \draw(\m)--(\target');
        }
    }
}
\end{document}

관련 정보