Usando condição (If/Else) dentro do loop (For) no Tikz

Usando condição (If/Else) dentro do loop (For) no Tikz

No meupostagem anterior, perguntei como usar dois loops para construir uma grade com valores dentro dela. Um maravilhosoresponder foi dado porAndré Swann.

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

ele forneceu uma fórmula \zque pode ser modificada para diferentes arranjos de valores.

Por exemplo, eu fiz-

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

que dá-

1 2 3 4

5 6 7 8

9 10 11 12

para grade 3*4. Mas se eu quiser -

1 2 2 1

3 4 4 3

5 6 6 5

7 8 8 7

e ,

1 2 3 4

5 6 7 8

0 9 10 0

0 11 12 0

0 13 14 0

Eu não pude fazer! Estou realmente tendo dificuldade para usar o loop e a condição if else. Provavelmente, estou muito acostumado com C++ e coisas semelhantes, onde posso facilmente fazer a=a+1 ou escrever uma condição if. Posso pensar em uma maneira de imprimir os arranjos de valores acima, usandoDoença(if/else), mas não sei onde colocar (tentei, mas todos estavam errados).

Então, minha pergunta é: como colocarDoença(if/else) antes \zpara que eu possa imprimir a saída como mostrei acima?

Responder1

Você poderia facilmente usar ifthenelse no nó tikz:

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

Isso deve criar a terceira grade desejada.

Veja também a resposta à seguinte pergunta para mais exemplos com ifthenelse e loops: If-then-else dentro do gráfico TikZ?

Responder2

Você pode usar no TikZ a frase "atribuição condicional", que você provavelmente conhece da linguagem C. A sintaxe é result = cond?v0:v1. Se a condição condfor verdadeira, v0será atribuído a result, caso contrário, v1será atribuído.

Esta expressão pode ser usada como parte da evaluatechave no seu código. Além disso, a expressão pode ser aninhada dentro de outra atribuição condicional, como por exemplo:result = cond1?(cond2?v0:v1):v2

Então, no seu caso (código adaptado da resposta de 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}

O que produz:

Resultado

Responder3

Poderíamos usar as funções de comparação/matemática lógica depgf(89.3.5 Comparação e funções lógicas no manual 3.0.1a), como equal(x,y)which retorna 0if xe ynot are equal e caso contrário retorna 1, e greater(x,y)which retorna 1if x>ye else 0e incorpore-os em suas evaluateinstruções junto com as funções minand .max

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

insira a descrição da imagem aqui

Para o seu primeiro exemplo, a função int(divide(\n,2)*(\y-1)+min(\x,\n+1-\x))parece corresponder ao seu primeiro exemplo, não exigindo realmente nenhuma condição, apenas a minfunção com um termo +\xand apropriado.-\x

A natureza por partes é introduzida através do uso de funções notlesse greaterque atuam como multiplicadores do número real de juros, que têm o mesmo tipo de efeito que as condicionais que você procurava.

Pode-se imaginar um caso mais geral que descreva o seu segundo caso, que imprime todos os números até a linha em que \mxocorre, após o que coloca um número \blnkde zeros como preenchimento em ambos os lados enquanto aumenta continuamente para o que a 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))função parece fazer o trabalho, ceilarredonda para o número inteiro mais próximo.

Para um caso mais mínimo de representar apenas a função que você deseja int(notless(\y,3)*greater(min(\x-1,\n-\x),0)*((\n-2)*(\y-3)+\x+7)+less(\y,3)*(4*(\y-1)+\x))funcionar, novamente usando a função notless andless to separate into two cases, and themin function inside themaior` para identificar quais colunas devem ter zero.

informação relacionada