我目前正在处理代码中的一个问题。我不断收到use of \nextx does not match its definition
来自该\pgfmathsetmacro\nextAsInt...
行的错误。但我看不出问题所在。它应该返回一个整数。
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{calc}
\usepackage{pgfmath}
\usepackage{ifthen}
\begin{document}
\begin{center}
\tdplotsetmaincoords{50}{-15}
\begin{tikzpicture}[tdplot_main_coords, scale = 1]
\def \xy{{ {2, 1, 0.5, 1},
{4, 1, 2, 3},
{3, 2, 4, 1},
{0.5, 3, 5, 4}}}
\foreach \x in {0,...,3}{
\foreach \y in {0,...,3}{
\pgfmathsetmacro\asInt{int(\xy[\y][\x])}
\pgfmathsetmacro\r{(\asInt+1)/2}
\def \nextx \ifthenelse {\x=3} {\value{\x}} {\value{\x+1}}
\def \nexty \ifthenelse {\y=3} {\value{\y}} {\value{\y+1}}
\pgfmathsetmacro\nextAsInt{int(\xy[int(\nextx)][int(\nexty)])}
\pgfmathsetmacro\nextr{(\nextAsInt+1)/2}
\draw[thick, blue, -](\x+0.5,\y+0.5,0) -- (\x+0.5,\y+0.5,\r);
\draw[fill = blue](\x+0.5,\y+0.5,\r) circle (2pt);
\draw[thick, green, -](\x,\y+0.5,\r) -- (\nextx,\nexty,\nextr)
}
}
\end{tikzpicture}
\end{center}
\end{document}
非常感谢。
答案1
它无法工作有几个原因。首先,它的\def
工作方式与你认为的不同;其次,它\value
是计数器,而不是检索某些算术表达式的值。
你最好使用\pgfmathsetmacro
以下方法:
\pgfmathsetmacro\nextx{\x==3 ? \x : \x+1}
这也是其他编程语言中的常见语法:之前的条件?
要么返回 1(如果测试为真),要么返回 0(如果测试为假);当为 1 时,采用冒号之前的分支,否则采用冒号之后的分支。
我不确定输出是否是你想要的,但如果我在设置变量后添加一些调试信息,我会得到
*** \x=0; \nextx=1.0; \y=0; \nexty=1.0 ***
*** \x=0; \nextx=1.0; \y=1; \nexty=2.0 ***
*** \x=0; \nextx=1.0; \y=2; \nexty=3.0 ***
*** \x=0; \nextx=1.0; \y=3; \nexty=3 ***
*** \x=1; \nextx=2.0; \y=0; \nexty=1.0 ***
*** \x=1; \nextx=2.0; \y=1; \nexty=2.0 ***
*** \x=1; \nextx=2.0; \y=2; \nexty=3.0 ***
*** \x=1; \nextx=2.0; \y=3; \nexty=3 ***
*** \x=2; \nextx=3.0; \y=0; \nexty=1.0 ***
*** \x=2; \nextx=3.0; \y=1; \nexty=2.0 ***
*** \x=2; \nextx=3.0; \y=2; \nexty=3.0 ***
*** \x=2; \nextx=3.0; \y=3; \nexty=3 ***
*** \x=3; \nextx=3; \y=0; \nexty=1.0 ***
*** \x=3; \nextx=3; \y=1; \nexty=2.0 ***
*** \x=3; \nextx=3; \y=2; \nexty=3.0 ***
*** \x=3; \nextx=3; \y=3; \nexty=3 ***
这样您就可以看到循环是如何进行的。如果您想看到相同的结果,请将 更改为\iffalse
(\iftrue
但当您确定正确的值时,请删除整个块)。
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{calc}
\usepackage{pgfmath}
\usepackage{ifthen}
\begin{document}
\begin{center}
\tdplotsetmaincoords{50}{-15}
\begin{tikzpicture}[tdplot_main_coords, scale = 1]
\def \xy{{%
{2, 1, 0.5, 1},
{4, 1, 2, 3},
{3, 2, 4, 1},
{0.5, 3, 5, 4}%
}}
\foreach \x in {0,...,3}{
\foreach \y in {0,...,3}{
\pgfmathsetmacro\asInt{int(\xy[\y][\x])}
\pgfmathsetmacro\r{(\asInt+1)/2}
\pgfmathsetmacro\nextx{\x==3 ? \x : \x+1}
\pgfmathsetmacro\nexty{\y==3 ? \y : \y+1}
\pgfmathsetmacro\nextAsInt{int(\xy[int(\nextx)][int(\nexty)])}
\pgfmathsetmacro\nextr{(\nextAsInt+1)/2}
\iffalse
\message{***
\string\x=\x; \string\nextx=\nextx;
\string\y=\y; \string\nexty=\nexty
\space***^^J%
}
\fi
\draw[thick, blue, -](\x+0.5,\y+0.5,0) -- (\x+0.5,\y+0.5,\r);
\draw[fill = blue](\x+0.5,\y+0.5,\r) circle (2pt);
\draw[thick, green, -](\x,\y+0.5,\r) -- (\nextx,\nexty,\nextr);
}
}
\end{tikzpicture}
\end{center}
\end{document}