也可以变换装饰

也可以变换装饰

以下代码尝试绘制“旗帜”。旗帜是一条线段,中间有一个框,从起点到终点位于左侧。我使用装饰为路径上的每条线段添加一个框。

\documentclass[tikz, crop, border=1]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing}

\begin{document}
\begin{tikzpicture}

\tikzset{
    flag/.style = {
        decoration = {
            show path construction,
            lineto code={%
                \drawFlag{(\tikzinputsegmentfirst)}{(\tikzinputsegmentlast)};
            },
            closepath code={%
                \drawFlag{(\tikzinputsegmentfirst)}{(\tikzinputsegmentlast)};
            },
        },
        preaction=decorate
    }
}

\newcommand{\drawFlag}[2]{
    \begin{scope}
        \coordinate (center) at ($#1!0.5!#2$) {};
        \coordinate (back) at ($(center)!0.25cm!#1$) {};
        \coordinate (front) at ($(center)!0.25cm!#2$) {};

        \draw[fill = white, line cap=round] 
            (back) -- 
            ($(back)!0.5cm!90:#2$) -- 
            ($(front)!0.5cm!90:#2$) -- 
            (front);
    \end{scope}
}

\begin{scope}[cm={1, 0, 0.5, 0.5, (0, 0)}]
\drawFlag{(0, 0)}{(2, 0)};
\draw (0, 0) -- (2, 0);
\drawFlag{(2, 0)}{(2, 2)};
\draw (2, 0) -- (2, 2);
\end{scope}

\begin{scope}[cm={1, 0, 0.5, 0.5, (3, 0)}]
\draw[flag] (0, 0) -- (2, 0) -- (2, 2);
\end{scope}

\end{tikzpicture}
\end{document}

该代码的运行结果如下:

在此处输入图片描述

旗帜以两种不同的方式绘制:单独绘制,然后作为装饰路径绘制。两种结果都应用了剪切/倾斜变换。单独绘制的结果(左侧)是我希望它看起来的样子。但是,当绘制装饰路径时,装饰似乎没有变换(右侧)。如何使装饰也变换,以便这些结果看起来相同?

注意:transform canvas不能给出正确的结果,因为它会扭曲线宽。

答案1

抱歉耽误了这么久,造成了混乱。在尝试制作一些既好用又优雅的东西失败了几次之后,我放弃了“优雅”的想法,而是提供了一些似乎可以工作的东西。步骤如下:

  1. 读出转换的非翻译部分。
  2. 使起点和终点坐标\tikzinputsegmentfirst具有\tikzinputsegmentlast符号性,以避免“过度”(即变换两次)。
  3. 安装转换。

结果如下。

\documentclass[tikz, crop, border=1]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing}

\begin{document}
\begin{tikzpicture}

\tikzset{get trafo/.code={\pgfgettransformentries{\gtma}{\gtmb}{\gtmc}{\gtmd}{\gtmp}{\gtmp}},
    flag/.style = {get trafo,
        decoration = {
            show path construction,
            lineto code={%
                \path (\tikzinputsegmentfirst) coordinate (tmpa)
                (\tikzinputsegmentlast) coordinate (tmpb);
                \begin{scope}[cm={\gtma,\gtmb,\gtmc,\gtmd, (0, 0)}]
                \drawFlag{(tmpa)}{(tmpb)};
                \end{scope}
            },
            closepath code={%
                \path (\tikzinputsegmentfirst) coordinate (tmpa)
                (\tikzinputsegmentlast) coordinate (tmpb);
                \begin{scope}[cm={\gtma,\gtmb,\gtmc,\gtmd, (0, 0)}]
                \drawFlag{(tmpa)}{(tmpb)};
                \end{scope}
            },
        },
        preaction=decorate
    }
}

\newcommand{\drawFlag}[2]{
    \begin{scope}
        \coordinate (center) at ($#1!0.5!#2$) {};
        \coordinate (back) at ($(center)!0.25cm!#1$) {};
        \coordinate (front) at ($(center)!0.25cm!#2$) {};

        \draw[fill = white, line cap=round] 
            (back) -- 
            ($(back)!0.5cm!90:#2$) -- 
            ($(front)!0.5cm!90:#2$) -- 
            (front);
    \end{scope}
}

\begin{scope}[cm={1, 0, 0.5, 0.5, (0, 0)}]
\drawFlag{(0, 0)}{(2, 0)};
\draw[get trafo] (0, 0) -- (2, 0);
\drawFlag{(2, 0)}{(2, 2)};
\draw (2, 0) -- (2, 2);
\end{scope}

\begin{scope}[cm={1, 0, 0.5, 0.5, (3, 0)}]
\draw[flag] (0, 0) -- (2, 0) -- (2, 2);
\end{scope}

\end{tikzpicture}
\end{document}

在此处输入图片描述

出于很多目的,我希望有一种方法可以使坐标“不具有符号性”(但不是像 那样困难的方法tkz-euclide)。如果任何读过这篇文章的人知道如何做到这一点,请告诉我,当然,我也愿意提出一个正式的问题。

相关内容