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 cond
erfüllt ist, v0
wird zugewiesen result
, andernfalls v1
wird zugewiesen.
Dieser Ausdruck kann als Teil des evaluate
Schlü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:
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, 0
wenn x
und y
ungleich sind, und gibt andernfalls zurück 1
, und greater(x,y)
„which“ gibt zurück, 1
wenn x>y
und andernfalls, und integrieren Sie diese zusammen mit den Funktionen und 0
in Ihre Anweisung .evaluate
min
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}
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 min
Funktion mit einem entsprechenden +\x
„und“ -\x
-Term.
Die stückweise Natur wird durch die Verwendung von notless
und greater
Funktionen 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 \blnk
auf 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 the
min function inside the
greater“ verwenden, um zu ermitteln, welche Spalten eine Null enthalten sollen.