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 \z
que 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 \z
para 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 cond
es verdadera, v0
se asignará a result
; en caso contrario, v1
se asignará.
Esta expresión se puede utilizar como parte de la evaluate
clave 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:
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 0
si x
y y
no son iguales y en caso contrario devuelve 1
, y greater(x,y)
que devuelve 1
si x>y
y en caso contrario 0
e incorpórelos en sus evaluate
instrucciones junto con las funciones min
y 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}
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 min
función con un +\x
término apropiado -\x
.
La naturaleza por partes se introduce mediante el uso de notless
funciones greater
que 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 \mx
ocurre, después de lo cual coloca una cantidad \blnk
de 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, ceil
redondea 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 and
less to separate into two cases, and the
min function inside the
mayor` para identificar qué columnas deben tener un cero.