装饰中节点的 rnd 最小宽度在重复代码中大小不一致

装饰中节点的 rnd 最小宽度在重复代码中大小不一致

我想用双行星星装饰路径,并希望上行星星与下行星星重复。但为什么部分星星state{initial}仍然是随机大小。

我尝试设置最小宽度,但它给出的星星都相同。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations,shapes.geometric,decorations.shapes,decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\pgfdeclaredecoration{stars}{initial}{
    \state{initial}[width=15pt ] {
        \pgfmathparse{round(rnd*100)}
        \pgfsetfillcolor{yellow!\pgfmathresult!orange}
        \pgfsetstrokecolor{yellow!\pgfmathresult!red}
        % set node mininum width
        %\pgfmathparse{\pgfkeysvalueof{/pgf/minimum width} }
        %\pgfset{minimum width=\pgfmathresult pt }

        \pgfnode{star}{center}{}{}{\pgfusepath{stroke,fill}} % line lower stars
        \pgftransformshift{\pgfpoint{0pt}{12pt}}  
        \pgfnode{star}{center}{}{}{\pgfusepath{stroke,fill}} % line upper stars
    }
    \state{final} {
        \pgfpathmoveto{\pgfpointdecoratedpathlast}
    }
}
\draw[decorate, decoration={stars}, star point ratio=2,  star points=5, inner sep=0, minimum width=rnd*10pt+2pt] (0,0) -- +(5,0);

\end{tikzpicture}
\end{document}

星星

答案1

如果需要多次访问 PGF 计算的结果,最好使用 将其存储在宏中\pgfmathtruncatemacro。这也是存储\pgfkeysvalueof{/pgf/minimum width}在宏中的正确方法。

需要这两行来使上方和下方的星星具有相同的大小:

\pgfmathtruncatemacro{\myresultB}{\pgfkeysvalueof{/pgf/minimum width}}
\pgfset{minimum width=\myresultB}

由于您想设置minumum width为某个随机值,因此您需要防止 TiZ 多次计算该值。这是通过上面的两行代码完成的,其中minimum width内部设置为计算出的随机值,当将其应用于两颗星星时,它将保持该值固定。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, decorations.shapes}

\pgfdeclaredecoration{stars}{initial}{
    \state{initial}[width=15pt] {
        \pgfmathtruncatemacro{\myresultA}{round(rnd*100)}
        \pgfsetfillcolor{yellow!\myresultA!orange}
        \pgfsetstrokecolor{yellow!\myresultA!red}
        % set node mininum width
        \pgfmathtruncatemacro{\myresultB}{\pgfkeysvalueof{/pgf/minimum width}}
        \pgfset{minimum width=\myresultB}
        \pgfnode{star}{center}{}{}{\pgfusepath{stroke,fill}} % line lower stars
        \pgftransformshift{\pgfpoint{0pt}{12pt}}  
        \pgfnode{star}{center}{}{}{\pgfusepath{stroke,fill}} % line upper stars
    }
    \state{final} {
        \pgfpathmoveto{\pgfpointdecoratedpathlast}
    }
}

\begin{document}
\begin{tikzpicture}

\draw[decorate, decoration={stars}, star point ratio=2,  star points=5, inner sep=0, minimum width={rnd*10pt+2pt}] (0,0) -- +(5.5,0);

\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容