Tikz:我可以使用纹理坐标插值图像吗?

Tikz:我可以使用纹理坐标插值图像吗?

在计算机图形学中,将图像的各个部分映射到三角形是很常见的。例如,请参见此图像维基百科 在此处输入图片描述

现在,我有一张图像,想将其部分分配给几个三角形,如上图中心所示,这样它就是连续的,但会根据三角形而扭曲。我更希望找到一种解决方案,我可以将图像的任意 [0,1]² 坐标分配给 tikz 路径(三角形),以便根据此坐标对图像进行插值和拉伸。

目前我能想到的:

  • 我可以用三角形剪切图像\clip

  • xslant/选项yslant似乎允许剪切图像,就像这个答案

但是,将两者结合在一起会很难获得正确的拉伸因子和连续性。请注意,我希望获得多个三角形的“仿射”图像的效果。

答案1

灵感来自链接答案“绘制不同形状的文本”我找到了一个解决方案。它计算纹理到单个三角形的仿射映射,并在单位纹理空间中进行裁剪和绘制。不幸的是,由于计算精度和范围有限,该解决方案并不可靠。根据三角形的不同,可能会出现错误或只是消失的三角形。

\documentclass{article}
\usepackage{tikz}

% Get X and Y of a coordinate as separated variables.
% Modified solution from: https://tex.stackexchange.com/a/58590/103072
\makeatletter
\newcommand{\gettikzxy}[3]{%
    \path #1;%
    \edef#2{ \strip@pt\pgf@x }%
    \edef#3{ \strip@pt\pgf@y }%
}
\makeatother

% Command to draw one textured triangle
% #1-#3 are coordinates of the triangle
% #4-#6 are texture coordinates in [0,1]^2 of the image
%       where (0,0) is bottom left
% #7 is the name of the image
\newcommand\texturedtriangle[7]{%
    % Decode all the coordinates into nice single numbers
    \gettikzxy{#1}{\ax}{\ay}
    \gettikzxy{#2}{\bx}{\by}
    \gettikzxy{#3}{\cx}{\cy}
    \gettikzxy{#4}{\tax}{\tay}
    \gettikzxy{#5}{\tbx}{\tby}
    \gettikzxy{#6}{\tcx}{\tcy}
    \gettikzxy{(1,1)}{\ux}{\uy}
    % Compute the required affine transformation
    \pgfmathsetmacro\det{\tax*(\tcy-\tby) + \tay*(\tbx-\tcx) - \tbx*\tcy + \tby*\tcx}
    \pgfmathsetmacro\aa{(\ax*(\tcy-\tby) + \tay*(\bx-\cx) - \bx*\tcy + \tby*\cx)/\det}
    \pgfmathsetmacro\ba{(\ax*(\tbx-\tcx) + \tax*(\cx-\bx) - \tbx*\cx + \bx*\tcx)/\det}
    \pgfmathsetmacro\ab{(\ay*(\tcy-\tby) + \tay*(\by-\cy) - \by*\tcy + \tby*\cy)/\det}
    \pgfmathsetmacro\bb{(\ay*(\tbx-\tcx) + \tax*(\cy-\by) - \tbx*\cy + \by*\tcx)/\det}
    \pgfmathsetmacro\tx{\ax - (\tax*\aa + \tay*\ba)}
    \pgfmathsetmacro\ty{\ay - (\tax*\ab + \tay*\bb)}
    \pgflowlevelobj{
        \pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\tx pt}{\ty pt}
    }{
        % We are inside the texture space here...
        \clip #4 -- #5 -- #6 -- cycle;
        % Draw a unit sized image (from (0,0) to (1,1) if no scale)
        \node at (0.5,0.5) {\includegraphics[width=\ux pt, height=\uy pt]{#7}};
    }
}

\begin{document}

\begin{tikzpicture}[scale=2]
    \texturedtriangle{(0,0)}{(2,0)}{(0.5,2)} {(0,0)}{(1,0)}{(0,1)} {dragon}
    \texturedtriangle{(2.5,1.5)}{(2,0)}{(0.5,2)} {(1,1)}{(1,0)}{(0,1)} {dragon} 
    \texturedtriangle{(2.5,1.5)}{(1,3)}{(0.5,2)} {(1,1)}{(1,0)}{(0,1)} {dragon}
    \texturedtriangle{(-0.5,2)}{(1,3)}{(0.5,2)} {(1,1)}{(1,0)}{(0,1)} {dragon}
    \draw (0,0) -- (2,0) -- (0.5,2) -- cycle;
    \draw (2.5,1.5) -- (2,0) -- (0.5,2) -- cycle;
    \draw (2.5,1.5) -- (1,3) -- (0.5,2) -- cycle;
    \draw (-0.5,2) -- (1,3) -- (0.5,2) -- cycle;
\end{tikzpicture}

\end{document}

代码的输出如下 PBRT 渲染的龙

相关内容