在绘制零件后蒂克兹, 是否有可能镜子该部分相对于某个轴或线吗?
平均能量损失
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[step=1.0,gray,thin] (0,0) grid (4,3);
\draw [thick](1,1) -- (0,0) -- (1,2); % Original Image
\draw [ultra thick,red] (2,0) -- (2,3); %axis
% code for Mirror Image
\draw [thick,blue](3,1) -- (4,0) -- (3,2); % Mirror Image
\end{tikzpicture}
\end{document}
答案1
您可以使用 ascope
和 反转xscale
和yscale
作为一个整体。这只是 ipsen 所做的另一种方法。 将scope
有助于仅反映图像的一部分。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (-1,1) -- (0,0) -- (1,1); % Original Image
\begin{scope}[yscale=-1,xscale=1]
\draw[red] (-1,1) -- (0,0) -- (1,1); % Mirror Image
\end{scope}
\end{tikzpicture}
\end{document}
更新:
您可以xscale/yscale
结合使用以xshift/yshift
获得所需效果。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[step=1.0,gray,thin] (0,0) grid (4,3);
\draw [thick](1,1) -- (0,0) -- (1,2); % Original Image
\draw [ultra thick,red] (2,0) -- (2,3); %axis
% code for Mirror Image
\begin{scope}[xscale=-1,xshift=-4cm]
\draw [thick,blue](1,1) -- (0,0) -- (1,2); % Mirror Image
\end{scope}
\end{tikzpicture}
\end{document}
答案2
这个答案被转换为自己的 PGF 和自己的 TikZ 库,ext.transformations.mirror
作为我的一部分tikz-ext
扩展包。
概括来说:我们希望在每个可能的轴上进行镜像。
但首先,要讨论一些特殊情况。
沿平行于X或者是(画布)轴。
正如在其他答案中所看到的,这相对容易做到,因为我们只需要加倍移动和交换正交轴的方向:
\def\pgftransformxmirror#1{%
\pgfmathparse{2*(#1)}%
\pgftransformcm{-1}{0}{0}{1}{\pgfqpoint{+\pgfmathresult pt}{+0pt}}}
\def\pgftransformymirror#1{%
\pgfmathparse{2*(#1)}%
\pgftransformcm{1}{0}{0}{-1}{\pgfqpoint{+0pt}{+\pgfmathresult pt}}}
TikZ 键xmirror
和ymirror
是这些 PGF 宏的包装器。它们接受
- 一个维度(带单位),直接用作X或者是价值。
- 一个被抛入的值(无单位)
\pgfpointxy
。请注意,转换仍然应用于画布系统! - 包裹在
( … )
其中的坐标被评估,并且其X或者是值被转发到 PGF 宏。请注意,这也仅适用于画布的变换。镜像坐标(0, 2)
并不(0, 1)
一定会导致(非镜像)坐标(0, 0)
。
沿通过原点的轴进行镜像。
此转换的公式取自维基百科页面变换矩阵(反射部分)并且是
或者用 TeX 来表示:
\def\pgftransformmirror#1{%
\pgfpointnormalised{#1}%
\pgf@xa=\pgf@sys@tonumber\pgf@y\pgf@x
\pgf@xb=\pgf@sys@tonumber\pgf@x\pgf@x
\pgf@yb=\pgf@sys@tonumber\pgf@y\pgf@y
\multiply\pgf@xa2\relax
\pgf@xc=-\pgf@yb\advance\pgf@xc\pgf@xb
\pgf@yc=-\pgf@xb\advance\pgf@yc\pgf@yb
\edef\pgf@temp{{\the\pgf@xc}{+\the\pgf@xa}{+\the\pgf@xa}{+\the\pgf@yc}}%
\expandafter\pgf@transformcm\pgf@temp{\pgfpointorigin}}
在定义开始时,该点#1
被标准化(反映分数),并在计算结束时
\pgf@xa
保持标准化值 2长度,\pgf@xc
保存标准化的值升2 –莉2和\pgf@yc
保存标准化的值莉2 –升2。
最后:沿任意轴镜像。
该公式大致基于另一篇维基百科文章,即镜像矩阵(是的,这是德语)并且转换简化为
- 移动到轴上的某个点,
- 沿轴镜像到原点
- 将原点移回。
TikZ 键mirror
可以处理“轴通过原点”和“任意轴”两种情况。
如果在其参数中遇到--
,则执行任意轴的代码,否则假定为坐标,并执行通过原点的轴的代码。
可能的改进
虽然xmirror
和ymirror
情况都是一般反射的基本简化,但沿任意轴和通过原点的轴的反射之间的差异毕竟不是很大,也许这两种情况可以合并在一个宏下。
使用内置转换。
回应Turion 的评论,我还实现了一个仅使用现有变换(移位、旋转、-1 缩放、旋转回来、移位回来)的版本。
此宏和键以大写字母Mirror
而非开头mirror
。
所有宏和键均在手动的。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{
backgrounds,
ext.transformations.mirror % https://ctan.org/pkg/tikz-ext
}
\tikzset{every picture/.append style={gridded, line join=round, line cap=round}}
\begin{document}
\begin{tikzpicture}
\draw[thick] (1,1) -- (0,0) -- (1,2);
\draw[ultra thick, red] (2,0) coordinate (@1) -- node[above,sloped] {Mirror} (2,3) coordinate (@2);
\begin{scope}[mirror=(@1)--(@2)]
\draw[thick, blue] (1,1) -- (0,0) -- (1,2);
\path[transform shape] (@1) -- node[above,sloped] {Mirror} (@2);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}
\draw[thick] (1,1) -- (0,0) -- (1,2);
\draw[ultra thick, red] (2,0) coordinate (@1) -- node[above,sloped] {Mirror} (2,3) coordinate (@2);
\begin{scope}[xmirror=2]
\draw[thick, blue] (1,1) -- (0,0) -- (1,2);
\path[transform shape] (@1) -- node[above,sloped] {Mirror} (@2);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}\pgfmathsetseed{7}
\draw[thick] (1,1) -- (0,0) -- (1,2);
\draw[ultra thick, red] (5*rand,5*rand) coordinate (@1) -- node[above,sloped] {Mirror} (5*rand,5*rand) coordinate (@2);
\begin{scope}[mirror=(@1)--(@2)]
\draw[thick, blue] (1,1) -- (0,0) -- (1,2);
\path[transform shape] (@1) -- node[above,sloped] {Mirror} (@2);
\end{scope}
\end{tikzpicture}
\end{document}
输出
答案3
这是通过spy
TikZ 库解决的解决方案。
要镜像图片,请使用mirror scope
及其两个子键创建范围:
center
定义镜子的位置,angle
定义镜子的方向。
将您的图片绘制到此范围内然后调用\mirror
。
(注意:边界框tikzpicture
不考虑镜像。)
例子:
\documentclass[tikz]{standalone}
\usetikzlibrary{spy}
\tikzset{
mirror scope/.is family,
mirror scope/angle/.store in=\mirrorangle,
mirror scope/center/.store in=\mirrorcenter,
mirror setup/.code={\tikzset{mirror scope/.cd,#1}},
mirror scope/.style={mirror setup={#1},spy scope={
rectangle,lens={rotate=\mirrorangle,yscale=-1,rotate=-1*\mirrorangle},size=80cm}},
}
\newcommand\mirror[1][]{\spy[overlay,#1] on (\mirrorcenter) in node at (\mirrorcenter)}
\begin{document}
\begin{tikzpicture}
\draw [help lines] (-2,0) grid (2,2);
\begin{scope}[mirror scope={center={0,0},angle=90}]
\draw[green] (0,0) -- (2,2);
\draw[red] (1,0) -- (2,2);
\node[blue,rotate=30] at (1,.5){Mirror};
\mirror;
\end{scope}
\end{tikzpicture}
\end{document}
动画示例:
\documentclass[tikz]{standalone}
\usetikzlibrary{spy}
\tikzset{
mirror scope/.is family,
mirror scope/angle/.store in=\mirrorangle,
mirror scope/center/.store in=\mirrorcenter,
mirror setup/.code={\tikzset{mirror scope/.cd,#1}},
mirror scope/.style={mirror setup={#1},spy scope={
rectangle,lens={rotate=\mirrorangle,yscale=-1,rotate=-1*\mirrorangle},size=80cm}},
}
\newcommand\mirror[1][]{\spy[overlay,#1] on (\mirrorcenter) in node at (\mirrorcenter)}
\begin{document}
\foreach \myangle in {0,5,...,175}{
\begin{tikzpicture}
\fill[white] (-2.1,-2.1) rectangle (2.1,2.1);
\draw [help lines] (-2,-2) grid (2,2);
\draw[orange] (0,0) -- ++(\myangle:2cm) -- ++(\myangle:-4cm);
\begin{scope}[mirror scope={angle=\myangle,center={0,0}}]
\draw[green] (0,0) -- (2,2);
\draw[red] (2,1) -- (1,0);
\node[blue,rotate=30] at (1,.5){Mirror};
\mirror;
\end{scope}
\end{tikzpicture}
}
\end{document}
答案4
例如,你可以改变坐标以获得镜像效果。通过坐标变换,可以实现垂直反射通过原点的线,例如
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (-1,1) -- (0,0) -- (1,1); % Original Image
\draw[red, x={(1,0)},y={(0,-1)}] (-1,1) -- (0,0) -- (1,1); % Mirror Image
\end{tikzpicture}
\end{document}
顺便说一句,如果你更具体地说明你想要什么,那么你甚至可能会得到更具体的答案;-)
更新:
Kumar 比我快一点 ;-),但确实可以通过结合上述程序和翻译来反映任何一点。在您的示例中,您将有
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[step=1.0,gray,thin] (0,0) grid (4,3);
\draw [thick](1,1) -- (0,0) -- (1,2); % Original Image
\draw [ultra thick,red] (2,0) -- (2,3); %axis
% code for Mirror Image
\draw [thick,blue,x={(-1,0)},y={(0,1)},xshift=4cm](1,1) -- (0,0) -- (1,2); % Mirror Image
\end{tikzpicture}
\end{document}