TikZ:使用bitset重新计算for循环中的变量

TikZ:使用bitset重新计算for循环中的变量

我正在尝试绘制我感兴趣的函数图,为此我需要重新计算 for 循环中变量的值。按照此主题,我使用数学库附带的 for 循环。对于我的计算,我还需要循环计数器的二进制扩展,为此我使用了 bitset 包。但是,我无法让它工作,也不知道哪里出了问题。这是一个 MWE:

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{math}
\usepackage{pgfmath,pgffor}
\usepackage{bitset}

\begin{document}
\begin{tikzpicture}
\foreach \i in {1, ..., 10}{%
    \bitsetSetDec{mybitset}{\i};

    \tikzmath{
        \x = 0; 
        \y = 0;

        for \j in {0,...,3}{
             \b = \bitsetGet{mybitset}{\j};
             \x = \x + \b;
             \y = \y +2* \b;
       };
    };
    \draw[red,thick] (\x, \y) -- ({\x +0.25}, \y);
}
\end{tikzpicture}
\end{document}

在我看来,问题出在这一行:

\b = \bitsetGet{mybitset}{\j};

但我不知道该如何修复。有什么建议吗?提前谢谢!

答案1

欢迎!主要有两个问题:

  1. 您不能只是期望能够像这样分配宏的值。
  2. 似乎你不能选择\j大于 的\i

为了解决第一个问题,你可以声明一个返回值的函数。这个函数被调用bitsetGet,它期望第一个参数是一个由分隔的字符串"..."。限制循环变量,使第二个问题不会发生,这样就会得到

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{math}
\usepackage{bitset}
\pgfmathdeclarefunction{bitsetGet}{2}{\begingroup
\edef\temp{\noexpand\edef\noexpand\pgfmathresult{\bitsetGet{#1}{#2}}}%
\temp
\pgfmathsmuggle\pgfmathresult
\endgroup}
\begin{document}
\begin{tikzpicture}
\foreach \i in {4, ..., 10}{%
    \bitsetSetDec{mybitset}{\i};
    \tikzmath{
        \x = 0; 
        \y = 0;     
         for \j in {0,1,2,3}{
               \b = bitsetGet("mybitset",\j); 
              \x = \x + \b;
              \y = \y +2* \b;
        };
        %print {$x=\x, y=\y$};
    };
    %\typeout{\x,\y}
    \draw[red,thick] (\x, \y) -- ({\x +0.25}, \y);
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

我在这里假设这是一个tikzmath问题。显然,有更简单的方法可以获得此输出。但是,直到最近我才开始意识到它有多强大\pgfmathdeclarefunction。(这里没有使用它的功能。在绘制某些东西并使用新技巧解析坐标时,它确实很方便。)

相关内容