Verwenden einer Bedingung (If/Else) innerhalb einer Schleife (For) in Tikz

Verwenden einer Bedingung (If/Else) innerhalb einer Schleife (For) in Tikz

In meinemvorherigen PostIch habe gefragt, wie man mit zwei Schleifen ein Raster mit Werten darin konstruieren kann. Ein wunderbaresAntwort wurde gegeben vonAndrew 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}

Er hat eine Formel bereitgestellt \z, die für unterschiedliche Werteanordnungen modifiziert werden kann.

Ich habe zum Beispiel-

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

was gibt-

1 2 3 4

5 6 7 8

9 10 11 12

für 3*4 Raster. Aber wenn ich will -

1 2 2 1

3 4 4 3

5 6 6 5

7 8 8 7

Und ,

1 2 3 4

5 6 7 8

0 9 10 0

0 11 12 0

0 13 14 0

Ich konnte es nicht tun! Ich habe wirklich Schwierigkeiten, Schleifen und if else-Bedingungen zu verwenden. Wahrscheinlich bin ich zu sehr an C++ und ähnliche Dinge gewöhnt, wo ich einfach a=a+1 machen oder if-Bedingungen schreiben kann. Ich kann mir eine Möglichkeit vorstellen, die obigen Werteanordnungen auszudrucken, indem ichZustand(if/else), aber ich weiß nicht, wo ich es hinstellen soll (ich habe es versucht, aber alles war falsch).

Meine Frage ist also, wie manZustand(if/else) vorher \z, damit ich die Ausgabe wie oben gezeigt ausdrucken kann?

Antwort1

Sie können ifthenelse problemlos im Tikz-Knoten verwenden:

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

Dadurch sollte das gewünschte dritte Raster erstellt werden.

Weitere Beispiele mit ifthenelse und Schleifen finden Sie auch in der Antwort auf die folgende Frage: Wenn-Dann-Sonst im TikZ-Diagramm?

Antwort2

Sie können in TikZ den Satz „bedingte Zuweisung“ verwenden, den Sie wahrscheinlich aus der Sprache C kennen. Die Syntax lautet result = cond?v0:v1. Wenn die Bedingung conderfüllt ist, v0wird zugewiesen result, andernfalls v1wird zugewiesen.

Dieser Ausdruck kann als Teil des evaluateSchlüssels in Ihrem Code verwendet werden. Außerdem kann der Ausdruck in eine andere bedingte Zuweisung eingebettet werden, wie zum Beispiel:result = cond1?(cond2?v0:v1):v2

Also, in Ihrem Fall (Code angepasst aus Vals Antwort):

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

Das Ergebnis:

Ergebnis

Antwort3

Man könnte die Vergleichs-/logischen Mathematikfunktionen vonpgf(89.3.5 Vergleichs- und logische Funktionen im Handbuch 3.0.1a), wie z. B. „ equal(x,y)which“ gibt zurück, 0wenn xund yungleich sind, und gibt andernfalls zurück 1, und greater(x,y)„which“ gibt zurück, 1wenn x>yund andernfalls, und integrieren Sie diese zusammen mit den Funktionen und 0in Ihre Anweisung .evaluateminmax

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

Bildbeschreibung hier eingeben

Für Ihr erstes Beispiel int(divide(\n,2)*(\y-1)+min(\x,\n+1-\x))scheint die Funktion Ihrem ersten Beispiel zu entsprechen, da keine wirkliche Bedingung erforderlich ist, sondern nur die minFunktion mit einem entsprechenden +\x„und“ -\x-Term.

Die stückweise Natur wird durch die Verwendung von notlessund greaterFunktionen eingeführt, die als Multiplikatoren für die tatsächliche Zahl von Interesse wirken und dieselbe Art von Wirkung haben wie die von Ihnen gesuchten Bedingungen.

Man kann sich einen allgemeineren Fall vorstellen, der Ihren zweiten Fall beschreibt, bei dem alle Zahlen bis zu einer Zeile ausgedruckt werden \mx, in der sie vorkommen, wonach \blnkauf beiden Seiten eine Anzahl von Nullen als Füllzeichen eingefügt wird, während weiterhin kontinuierlich auf die nächste Ganzzahl aufgerundet wird, für die die 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))Funktion offenbar funktioniert ceil.

In einem Minimalfall, in dem nur die gewünschte Funktion dargestellt wird int(notless(\y,3)*greater(min(\x-1,\n-\x),0)*((\n-2)*(\y-3)+\x+7)+less(\y,3)*(4*(\y-1)+\x)), können Sie erneut die Funktion notless and„less to separate into two cases, and themin function inside thegreater“ verwenden, um zu ermitteln, welche Spalten eine Null enthalten sollen.

verwandte Informationen