Usando la condición (If/Else) dentro del bucle (For) en Tikz

Usando la condición (If/Else) dentro del bucle (For) en Tikz

En miPublicación anterior, Le pregunté cómo usar dos bucles para construir una cuadrícula con valores dentro. Un maravillosorespuesta fue dado porAndres 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}

ha proporcionado una fórmula \zque puede modificarse para diferentes disposiciones de valores.

Por ejemplo, yo hice-

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

lo que da-

1 2 3 4

5 6 7 8

9 10 11 12

para rejilla 3*4. Pero si quiero -

1 2 2 1

3 4 4 3

5 6 6 5

7 8 8 7

y ,

1 2 3 4

5 6 7 8

0 9 10 0

0 11 12 0

0 13 14 0

¡No pude hacerlo! Realmente estoy teniendo dificultades para usar el bucle y la condición if else. Probablemente, estoy demasiado acostumbrado a C++ y cosas similares donde puedo hacer fácilmente a=a+1 o escribir la condición if. Puedo pensar en una forma de imprimir los arreglos de valores anteriores, usandoCondición(si/si no), pero no sé dónde ponerlo (lo he intentado, pero todos salieron mal).

Entonces mi pregunta es como ponerCondición(if/else) antes \zpara poder imprimir el resultado como se muestra arriba?

Respuesta1

Podrías usar fácilmente ifthenelse en el nodo 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}

Esto debería crear la tercera cuadrícula que deseabas.

Consulte también la respuesta a la siguiente pregunta para obtener más ejemplos con ifthenelse y bucles: ¿Si-entonces-otra cosa dentro del gráfico TikZ?

Respuesta2

Puedes utilizar en TikZ la frase "asignación condicional", que probablemente conozcas del lenguaje C. La sintaxis es result = cond?v0:v1. Si la condición condes verdadera, v0se asignará a result; en caso contrario, v1se asignará.

Esta expresión se puede utilizar como parte de la evaluateclave en su código. Además, la expresión se puede anidar dentro de otra asignación condicional, como por ejemplo:result = cond1?(cond2?v0:v1):v2

Entonces, en su caso (código adaptado de la respuesta 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}

Que produce:

Resultado

Respuesta3

Se podrían utilizar las funciones matemáticas lógicas/de comparación depgf(89.3.5 Comparación y funciones lógicas en el manual 3.0.1a) como equal(x,y)which devuelve 0si xy yno son iguales y en caso contrario devuelve 1, y greater(x,y)que devuelve 1si x>yy en caso contrario 0e incorpórelos en sus evaluateinstrucciones junto con las funciones miny 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}

ingrese la descripción de la imagen aquí

Para su primer ejemplo, la función int(divide(\n,2)*(\y-1)+min(\x,\n+1-\x))parece coincidir con su primer ejemplo, y en realidad no requiere ninguna condición, solo la minfunción con un +\xtérmino apropiado -\x.

La naturaleza por partes se introduce mediante el uso de notlessfunciones greaterque actúan como multiplicadores del número real de intereses, que tienen el mismo tipo de efecto que los condicionales que buscaba.

Uno puede imaginar un caso más general que describe su segundo caso, que imprime todos los números hasta la fila en la que \mxocurre, después de lo cual coloca una cantidad \blnkde ceros como relleno en cada lado mientras continúa aumentando continuamente para lo cual la 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))función parece funcionar. el trabajo, ceilredondea al número entero más cercano.

Para un caso más mínimo de representar solo la función que desea int(notless(\y,3)*greater(min(\x-1,\n-\x),0)*((\n-2)*(\y-3)+\x+7)+less(\y,3)*(4*(\y-1)+\x)), use nuevamente la función notless andless to separate into two cases, and themin function inside themayor` para identificar qué columnas deben tener un cero.

información relacionada