为什么 PGF 要求新箭头类型的设计者明确指定箭头的凸包?

为什么 PGF 要求新箭头类型的设计者明确指定箭头的凸包?

根据 TikZ & PGF 手册 3.0.1a 版(第 1016 页)的“定义新箭头尖类型”一章,每次定义新箭头尖类型时必须指定的参数之一是凸包

形状的凸包在概念上类似于其边界框(但两者并不完全相同)。为了说明凸包的概念,请考虑以下设计中的箭头尖的图片。箭头尖的凸包是三角形,其顶点为 (1,0)、(-3,2) 和 (-3,-2)。

箭尖。

有人可能会想,既然 PGF 具有计算边界框的内置机制,为什么箭头类型的设计者还需要明确指定凸包。手册对这个问题的回答如下(第 1016 页第 100.2 节的最后一点)。

通常,PGF会自动跟踪您绘制的所有内容的边界框。但是,由于箭头尖端绘制得如此频繁,因此PGF会在内部缓存绘制箭头尖端所需的代码,并且由于此缓存,它无法仅根据用于绘制尖端的绘制命令来确定箭头尖端的大小。相反,必须在定义中明确提供箭头尖端的凸包。

为什么绘制箭头所需代码的缓存会阻止 PGF 在没有用户提示的情况下计算箭头的边界框?

答案1

红色框是官方的边界框。

绿色框是箭头的边界框。

蓝色框是使用绿色框而不是凸包计算的虚构边界框。


播放代码

\documentclass[border=9,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\foreach\i in{1,...,60}{
    \tikz[line width=.1cm]{
        \draw[rotate=\i*6,line width=1cm,-{>[length=3cm]}](0,0)--(7,0);
        \draw[red](current bounding box.south west)rectangle(current bounding box.north east);
        \pgfinterruptboundingbox
            \draw[line width=1cm,-{>[length=3cm]},transparent](6,0)--(7,0);
            \path(current bounding box.south west)coordinate(A)
                 (current bounding box.south east)coordinate(B)
                 (current bounding box.north west)coordinate(C)
                 (current bounding box.north east)coordinate(D);
            \draw[green,transform canvas={rotate=\i*6}](A)rectangle(D);
        \endpgfinterruptboundingbox
        \path([rotate=\i*6]A)([rotate=\i*6]B)([rotate=\i*6]C)([rotate=\i*6]D);
        \draw[blue](current bounding box.south west)rectangle(current bounding box.north east);
        \path(-10,-10)(10,10);
    }
}
\end{document}

相关内容