关于 PGF 装饰,请考虑具有朗朗上口的名称的两个维度(TikZ 和 PGF 手册 3.0.1a 版第 1001 页)
\pgfdecoratedinputsegmentremainingdistance
...输入路径当前输入段的剩余距离。\pgfdecoratedinputsegmentcompleteddistance
... 输入路径的当前输入段上完成的距离。
我不明白
- 输入什么部分是?
- PGF 如何计算其余的(分别完全的)当前输入段的距离?
第一个问题的答案很复杂,因为有多个类似的概念可以描述为输入段。
- 输入段是输入路径的一部分。每条路径可分解为零个或多个部分。一般而言,部分以一个
moveto
操作开始,并在下一个操作之前moveto
或下一个操作之前结束pgfuse
(以先到者为准)。 - 输入段是与单个路径扩展操作相对应的路径的子集:
输入路径可能由多条直线和曲线输入段组成(例如,一个圆或一个椭圆由四条曲线组成。)(第 996 页底部)
- 装饰自动机将输入路径分成几段,如下所示:当自动机进入新状态时,
s
下一段是输入路径的子集,从前e
一段的末尾到p
输入路径上更远的点,其曲线距离由的选项e
指定。s
width
注意
- 一个段(1)可以由多个段(2)组成。
- 一个段(2)可以由多个段(3)组成。
- 一个段(3)可跨越多个段(1),也可以跨越多个段(2)。
第二个问题的答案因以下事实而变得复杂:
装饰输出路径与装饰输入路径不同。
“您提供的宽度不必是片段的“真实”宽度,这允许装饰片段重叠或相距较远。”(第 997 页)
答案1
当你写作时
\draw (0,0) -- (1,0) arc (20:230:1 and 2);
这转化为\pgfpathmoveto
等\pgfpathlineto
基元。每个基元都表示一个输入段。如果有嵌套修饰,它们也会成为子基元,并且每个子基元都是用户输入的路径段。
路径长度由软路径层计算,我不知道该如何总结。一旦知道总长度,状态机就会开始更新修饰路径,并在每一步根据最后一个修饰点减少剩余的距离寄存器。