PGF 宏将值映射到不同的间隔

PGF 宏将值映射到不同的间隔

我正在尝试编写一个宏,用于rndTikz 中的随机生成器(特别是),将数字映射到不同的间隔。

[0, 1] ---> [a, b]
f(x) = x*(b-a) + a

我到目前为止尝试的是:

\documentclass[tikz]{standalone}
\usetikzlibrary{hobby}
\newcommand{\interval}[3]{%
    \pgfmathparse{(#3-#2)*#1 + #2}
}
\newcommand{\showinterval}[3]{%
    \interval{#1}{#2}{#3}\pgfmathresult
}
\begin{document}
   \tikzset{
        potato/.pic = {
            \draw[use Hobby shortcut,closed]
            (0,0) .. (\showinterval{rnd}{0}{0.5},0.5) .. (1,0);
        }
}
    \begin{tikzpicture}
        \draw (0, 0) rectangle (1, 1);    
        \draw (0,0) pic[scale=0.1] {potato};
    \end{tikzpicture} 
\end{document}

但我收到一个错误Incomplete \iffalse; all text was ignored,似乎与 pgf 宏的不可扩展性有关。理论上,\showinterval宏是为了避免这个问题而制作的。

缺陷在哪里?

答案1

我没有检查它出错的具体位置,但 TikZ 解析器通常会出现这种情况,如果你抛出涉及其自身机制的未经处理的宏,它经常会卡住。

这是另一种选择,通过使用定义适当的数学函数declare function

\documentclass[tikz]{standalone}
\usetikzlibrary{hobby}
\begin{document}
\begin{tikzpicture}[
potato/.pic = {\draw[use Hobby shortcut,closed] (0,0) 
                     .. ({intervalmap(0,0.5,rnd)},0.5) .. (1,0);},
declare function={intervalmap(\a,\b,\s) = \s*(\b - \a) + \a;}
]
\draw (0, 0) rectangle (1, 1);
\draw (0,0) pic[scale=.1] {potato};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

其中一种方法是与 合作\pgfextra

\documentclass[tikz]{standalone}
\usetikzlibrary{hobby}
\newcommand{\myinterval}[3]{%
    \pgfmathparse{(#3-#2)*#1 + #2}
    \xdef\myx{\pgfmathresult}
}

\begin{document}
   \tikzset{
        potato/.pic = {
            \draw[use Hobby shortcut,closed]
            \pgfextra{\myinterval{rnd}{0}{0.5}}
            (0,0) .. (\myx,0.5) .. (1,0);
        }
}
    \begin{tikzpicture}
        \draw (0, 0) rectangle (1, 1);    
        \draw (0,0) pic[scale=0.1] {potato};
    \end{tikzpicture} 
\end{document}

相关内容