Tikz의 조건(If/Else) 내부 루프(For) 사용

Tikz의 조건(If/Else) 내부 루프(For) 사용

이전 게시물, 나는 두 개의 루프를 사용하여 그 안에 값이 있는 그리드를 구성하는 방법을 물었습니다. 멋진답변 에 의해 주어졌다앤드루 스완.

\documentclass{article}

\usepackage{tikz}

\begin{document}

\def\n{6}
\def\m{8}
\def\s{1.5cm}
\tikz\draw grid[step=\s](\n*\s,\m*\s) foreach[evaluate] \x  in {1,...,\n}
  { foreach[evaluate={\z = int(min(\x,\n+1-\x)+\n*min(\y-1,\m-\y)/2)}] \y in {1,...,\m}
  {({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\z$}}};

\end{document}

\z그는 다양한 값 배열에 맞게 수정될 수 있는 공식을 제공했습니다 .

예를 들어, 저는-

[평가= {\z = int(\x+\n*min(\y-1,\m+\y))}]

그것은-

1 2 3 4

5 6 7 8

9 10 11 12

3*4 그리드의 경우. 하지만 내가 원한다면 -

1 2 2 1

3 4 4 3

5 6 6 5

7 8 8 7

그리고 ,

1 2 3 4

5 6 7 8

0 9 10 0

0 11 12 0

0 13 14 0

나는 그것을 할 수 없었다! 루프와 if else 조건을 사용하는 데 정말 어려움을 겪고 있습니다. 아마도 저는 C++ 및 a=a+1을 쉽게 수행하거나 if 조건을 작성할 수 있는 유사한 작업에 너무 많이 익숙했을 것입니다. 다음을 사용하여 위의 값 배열을 인쇄하는 방법을 생각할 수 있습니다.상태(if/else), 하지만 어디에 넣어야 할지 모르겠습니다(시도했지만 모두 틀렸습니다).

그래서 내 질문은, 어떻게 넣어야 하는가입니다.상태(if/else) 이전에 \z위에 표시된 대로 출력을 인쇄할 수 있습니까?

답변1

tikz 노드에서 ifthenelse를 쉽게 사용할 수 있습니다.

\documentclass{minimal}
\usepackage{tikz}
\usepackage{ifthen}

\begin{document}

\def\n{4}
\def\m{4}
\def\s{1.5cm}
\tikz\draw grid[step=\s](\n*\s,\m*\s) 
  foreach[evaluate] \x  in {1,...,\n} { 
    foreach[evaluate={
      \zt = int(\x+\n*min(\y-1,\m+\y));
      \zb = int(\x+(\n-2)*min(\y-1,\m+\y)+3)
    }] \y in {1,...,\m} {
      ({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\ifthenelse{\y>2}{\ifthenelse{\x=1 \OR \x>3}{0}{\zb}}{\zt}$}
    }
  };

\end{document}

그러면 원하는 세 번째 그리드가 생성됩니다.

ifthenelse 및 루프에 대한 더 많은 예를 보려면 다음 질문에 대한 답변을 참조하세요. TikZ 그래프 안에 If-then-else가 있습니까?

답변2

TikZ에서는 아마도 C 언어에서 알고 있는 "조건부 할당" 문장을 사용할 수 있습니다. 구문은 입니다 result = cond?v0:v1. 조건이 condtrue이면 v0에 할당되고 result, 그렇지 않으면 에 v1할당됩니다.

evaluate이 표현식은 코드에서 키 의 일부로 사용될 수 있습니다 . 또한 표현식은 다음과 같이 다른 조건부 할당 내에 중첩될 수 있습니다.result = cond1?(cond2?v0:v1):v2

따라서 귀하의 경우 (val의 답변에 따라 수정된 코드):

\documentclass[border=1cm]{standalone}
\usepackage{tikz}

\begin{document}

\def\n{4}
\def\m{4}
\def\s{1.5cm}
\noindent\tikz\draw grid[step=\s](\n*\s,\m*\s) 
  foreach[evaluate] \x  in {1,...,\n} { 
    foreach[evaluate={
      \zt = int(\x+\n*min(\y-1,\m+\y));
      \zb = int(\x+(\n-2)*min(\y-1,\m+\y)+3);
      \zr = \y>2?((\x==1)||(\x>3)?0:\zb):\zt     % <-------- see here
    }] \y in {1,...,\m} {
      ({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{\zr}
    }
  };

\end{document}

다음을 생성합니다.

결과

답변3

다음의 비교/논리 수학 기능을 사용할 수 있습니다.pgf(89.3.5 3.0.1a 매뉴얼의 비교 및 ​​논리 함수) if 및 is not 을 equal(x,y)반환 하고 그렇지 않으면 을 반환하고 , if 및 else를 반환하고 이를 및 함수 와 함께 명령어 에 통합합니다 .0xy1greater(x,y)1x>y0evaluateminmax

\documentclass[tikz,border=5mm]{standalone}

\begin{document}
\def\n{4}
\def\m{6}
\def\blnk{1}
\def\mx{8}
\def\s{1.5cm}
\tikz\draw grid[step=\s](\n*\s,\m*\s) foreach \x  in {1,...,\n}
  { foreach[evaluate={\z = int(divide(\n,2)*(\y-1)+min(\x,\n+1-\x))}] \y in {1,...,\m}
  {({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\z$}}};
\tikz\draw grid[step=\s](\n*\s,\m*\s) foreach \x  in {1,...,\n}
  { foreach[evaluate={\z = int(notless(\n*(\y-1),\mx)*greater(min(\x-\blnk,\n+1-\x-\blnk),0)*((\n-2*\blnk)*(\y-ceil(divide(\mx,\n))-1)  +\x-\blnk+\n*ceil(divide(\mx,\n)))+less(\n*(\y-1),\mx)*(\n*(\y-1)+\x))}] \y in {1,...,\m}
  {({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\z$}}};
\end{document}

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

첫 번째 예의 경우 함수는 int(divide(\n,2)*(\y-1)+min(\x,\n+1-\x))첫 번째 예와 일치하는 것으로 보이며 실제로는 min적절한 용어가 있는 함수 +\x만 요구하지 않습니다 -\x.

조각별 특성은 실제 관심 개수에 대한 승수 역할을 하는 함수를 사용하여 도입되며 notless, greater이는 이후의 조건문과 동일한 효과를 갖습니다.

두 번째 경우를 설명하는 보다 일반적인 경우를 상상할 수 있습니다. 이 경우는 발생하는 일부 행까지 모든 숫자를 인쇄한 \mx후 함수가 수행하는 \blnk것처럼 계속 증가하면서 양쪽에 패딩으로 여러 개의 0을 배치합니다. 가장 가까운 정수로 반올림됩니다 int(notless(\n*(\y-1),\mx)*greater(min(\x-\blnk,\n+1-\x-\blnk),0)*((\n-2*\blnk)*(\y-ceil(divide(\mx,\n))-1)+\x-\blnk+\n*ceil(divide(\mx,\n)))+less(\n*(\y-1),\mx)*(\n*(\y-1)+\x)).ceil

원하는 함수만 표현하는 보다 최소한의 경우에는 less min great` 함수를 int(notless(\y,3)*greater(min(\x-1,\n-\x),0)*((\n-2)*(\y-3)+\x+7)+less(\y,3)*(4*(\y-1)+\x))사용하여 0이 있어야 하는 열을 식별합니다.notless andto separate into two cases, and thefunction inside the

관련 정보