以下代码尝试绘制“旗帜”。旗帜是一条线段,中间有一个框,从起点到终点位于左侧。我使用装饰为路径上的每条线段添加一个框。
\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
抱歉耽误了这么久,造成了混乱。在尝试制作一些既好用又优雅的东西失败了几次之后,我放弃了“优雅”的想法,而是提供了一些似乎可以工作的东西。步骤如下:
- 读出转换的非翻译部分。
- 使起点和终点坐标
\tikzinputsegmentfirst
具有\tikzinputsegmentlast
符号性,以避免“过度”(即变换两次)。 - 安装转换。
结果如下。
\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
)。如果任何读过这篇文章的人知道如何做到这一点,请告诉我,当然,我也愿意提出一个正式的问题。