在 tikz 中旋转淡入淡出

在 tikz 中旋转淡入淡出

tikz想画一个顶部和底部渐变的狭长矩形。这应该代表激光束。

我定义了一个tikz淡入淡出效果,只要光束是水平的,它就可以正常工作。当我旋转矩形时,淡入淡出效果不会像以前一样产生光束。我尝试使用淡入淡出变换选项来旋转淡入淡出光束,但没有成功。因为我想在一张图片中绘制几个具有不同旋转的光束,所以我认为我应该避免使用画布变换。

这是我的示例代码:

\documentclass{minimal}
\usepackage{tikz}

\begin{document}

\usetikzlibrary{fadings}

\tikzfading[name=middle,
            top color=transparent!100,
            bottom color=transparent!100,
            middle color=transparent!20]

\begin{tikzpicture}

\fill[path fading=middle, red] (0,0) rectangle (4,0.2);
\fill[rotate=-20, path fading=middle, red] (0,0) rectangle (4,0.2);
\fill[rotate=20, path fading=middle, fading transform={rotate=20}, red] (0,0) rectangle (4,0.2);


\end{tikzpicture}

\end{document}

如何才能获得旋转光束的正确衰落?

答案1

应用画布变换:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fadings}

\tikzfading[name=middle,
            top color=transparent!100,
            bottom color=transparent!100,
            middle color=transparent!20]

\begin{document}

\begin{tikzpicture}
\fill[path fading=middle, red] (0,0) rectangle (4,0.2);
\foreach \angle in {20,40,...,340}
  \fill[transform canvas={rotate=-\angle},path fading=middle, red] (0,0) rectangle (4,0.2);
\end{tikzpicture}

\end{document}

在此处输入图片描述

作为保罗·加博利在评论中提到,画布变换需要非常小心;以下引述取自手册pgf

同样重要的是,当您使用画布变换时,pgf会丢失节点位置和图片大小的轨迹,因为它在计算节点坐标时没有考虑画布变换的影响(但是,您不依赖于此;它可能会在未来发生变化)。

答案2

淡入淡出效果将应用于路径的边界框。使用简单的rotate,边界框始终与原始画布对齐。使用canvas transform,您可以旋转路径但您会失去边界框的自动计算。因此您必须使用两个操作:

  1. 简单地rotate使用您的路径而无需绘图来更新边界框。

  2. 旋转canvas transform并淡入淡出绘制路径。

在此处输入图片描述

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fadings}

\tikzfading[name=middle,
            top color=transparent!100,
            bottom color=transparent!100,
            middle color=transparent!20]

\begin{document}
\begin{tikzpicture}
\fill[path fading=middle, red] (0,0) rectangle (4,0.2);

% update bounding box
\begin{scope}[rotate=45]
  \path (0,-2) rectangle ++(4,.2);
\end{scope}
% draw with (canvas) rotated fading
\begin{scope}[transform canvas={rotate=45}]
  \fill[path fading=middle,orange] (0,-2) rectangle ++(4,.2);
\end{scope}

\end{tikzpicture}
\end{document}

相关内容