![TikZ 中的文本具有透视效果(不仅仅是倾斜)](https://linux22.com/image/391640/TikZ%20%E4%B8%AD%E7%9A%84%E6%96%87%E6%9C%AC%E5%85%B7%E6%9C%89%E9%80%8F%E8%A7%86%E6%95%88%E6%9E%9C%EF%BC%88%E4%B8%8D%E4%BB%85%E4%BB%85%E6%98%AF%E5%80%BE%E6%96%9C%EF%BC%89.png)
我想在 Ti 中显示文本钾透视扭曲的 Z,如下所示:
TeX.SE 上有许多类似的解决方案(这里,这里, 或者这里),但我发现所有的都是仅通过倾斜和倾角来伪造透视的。
解决方案应该将文本转换为:
- 有一个水平消失点,所有通常水平平行的线都明显汇聚到该点
- 有一个垂直消失点,所有通常垂直平行的线都汇聚到该点,或保持它们严格平行(如我上面的例子)
- 如果您的解决方案允许用户明确定义消失点,则可获得奖励。
您可以将此作为起点:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[draw,align=left] at (0,0) {some text\\maybe with line breaks};
\end{tikzpicture}
\end{document}
答案1
这种方法将单词划分为小三角形,并对每个三角形应用倾斜和倾斜。这适用于投影以及一般的非线性变换。
之前已经出现过
\documentclass[border=9,tikz]{standalone}
\begin{document}
\fontsize{188pt}{0}\bfseries
\pgfmathdeclarefunction{fxx}{2}{\pgfmathparse{fx(#1+1,#2)-fx(#1,#2)}}
\pgfmathdeclarefunction{fxy}{2}{\pgfmathparse{fy(#1+1,#2)-fy(#1,#2)}}
\pgfmathdeclarefunction{fyx}{2}{\pgfmathparse{fx(#1,#2+1)-fx(#1,#2)}}
\pgfmathdeclarefunction{fyy}{2}{\pgfmathparse{fy(#1,#2+1)-fy(#1,#2)}}
\begin{tikzpicture}
\pgfmathdeclarefunction{gx}{2}{\pgfmathparse{3*#1-20}}
\pgfmathdeclarefunction{gy}{2}{\pgfmathparse{3.1622*#2}}
\pgfmathdeclarefunction{gz}{2}{\pgfmathparse{#1+10}}
\pgfmathdeclarefunction{fx}{2}{\pgfmathparse{gx(#1,#2)*6/gz(#1,#2)}}
\pgfmathdeclarefunction{fy}{2}{\pgfmathparse{gy(#1,#2)*6/gz(#1,#2)}}
\clip(-15,-9)rectangle(15,10);
\foreach\i in{0,...,40}{
\foreach\j in{-3,...,3}{
\pgfmathsetmacro\aa{fxx(\i,\j)}
\pgfmathsetmacro\ab{fxy(\i,\j)}
\pgfmathsetmacro\ba{fyx(\i,\j)}
\pgfmathsetmacro\bb{fyy(\i,\j)}
\pgfmathsetmacro\xx{fx (\i,\j)}
\pgfmathsetmacro\yy{fy (\i,\j)}
\pgflowlevelobj{
\pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\xx cm}{\yy cm}
}{
\clip(1,0)--(0,0)--(0,1)--cycle;
\draw(1,0)--(0,0)--(0,1)--cycle;
\tikzset{shift={(-\i,-\j)}}
\path(20,.5)node{WORDART};
}
\pgfmathsetmacro\aa{fxx(\i ,\j+1)}
\pgfmathsetmacro\ab{fxy(\i ,\j+1)}
\pgfmathsetmacro\ba{fyx(\i+1,\j )}
\pgfmathsetmacro\bb{fyy(\i+1,\j )}
\pgfmathsetmacro\xx{fx (\i+1,\j+1)}
\pgfmathsetmacro\yy{fy (\i+1,\j+1)}
\pgflowlevelobj{
\pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\xx cm}{\yy cm}
}{
\clip(0,0)--(-1,0)--(0,-1)--cycle;
\draw(0,0)--(-1,0)--(0,-1)--cycle;
\tikzset{shift={(-\i-1,-\j-1)}}
\path(20,.5)node{WORDART};
}
}
}
\end{tikzpicture}
\end{document}