作为之前问题的后续,如何在倾斜域中使用轮廓图?
答案1
我依靠我的回答TikZ 中类似 Gimp 的透视变换使图像变细。由于图像只能从左到右变细,因此我必须进行两次旋转才能使图像从前到后变细。
此外,pgfplots 占用大量内存,我遇到了内存溢出问题,根据这个问题,如何扩展 TeX 的“主内存大小”?(pgfplots 内存过载)。因此,我没有处理外部化的图等,而是采用了引用问题的代码(边框为 0 毫米)来生成基本的未转换的矩形图像,并将其保存为 myplot.pdf。
然后我根据上面提到的答案来使用这个代码我认为这并不能解决透视问题,最初由 Andrew Kepert 在评论我的回答时指出TikZ 中类似 Gimp 的透视变换也就是说,虽然原帖作者的问题中给出的直线在这种变换下仍然是直的,但是可以看出,图形的原始对角线在这种变换下不再是直的。
\documentclass{article}
\usepackage{ifthen,trimclip,calc,fp,graphicx,xcolor}
\newsavebox\mytext
\newcounter{mycount}
\newlength\clipsize
\newcommand\tapertext[5][0]{%
\edef\neck{#3}% percent to depress the amplitude
\def\cuts{#4}% Number of cuts
\savebox{\mytext}{#5}% TEXT
\FPeval{\myprod}{1/cuts}%
\clipsize=\myprod\wd\mytext\relax%
\setcounter{mycount}{0}%
\whiledo{\value{mycount}<\cuts}{%
\stepcounter{mycount}%
\edef\NA{\themycount}%
\edef\NB{\the\numexpr\cuts-\themycount\relax}%
\FPeval{\myprod}{\NA/\cuts}%
\ifnum0#1=0\relax%
\FPeval{\myprod}{1 - \neck*(\myprod)}%
\else%
\FPeval{\myprod}{1 - \neck*(1-\myprod)}%
\fi%
\FPmul{\myprodB}{\myprod}{\myprod}%
\scalebox{\myprod}[1]{\clipbox{%
\value{mycount}\clipsize\relax{} %
-1pt %
\wd\mytext-\value{mycount}\clipsize-\clipsize\relax{} %
-1pt%
}%
{\raisebox{#2\dimexpr\ht\mytext-\myprodB\ht\mytext}{%
\scalebox{1}[\myprodB]{\usebox{\mytext}}}}%
}}%
}
\begin{document}
\rotatebox{90}{\tapertext{.00}{.25}{99}{\rotatebox[origin=left]{-90}{\includegraphics{myplot}}}}
\end{document}
它获取之前生成的矩形图像(旋转后),对其进行 99 个垂直切片,并根据需要缩放和凸起每个丝带切片。最后,它将图像旋转回原始方向。
问题是参数\tapertext
不一定与所需的角度等相对应。第一个强制参数影响左/右倾斜(值1.0
使左边缘垂直),而第二个强制参数(#3
)与...有关图像尾部相对于前部的净收缩(即后边缘长度是#3
前边缘长度的 (1 - ^2) 倍,并且值使1.0
图像逐渐变细到消失点)。\rotatebox{90}{\tapertext{.10}{.50}{99}{\rotatebox[origin=left]{-90}{\includegraphics{myplot}}}}
例如,使用会产生以下效果: