TikZ:如何应用仿射变换?

TikZ:如何应用仿射变换?

我想画这样的东西:

在此处输入图片描述

目前我能做的最好的事情是:

\documentclass{article}
\usepackage{tikz}

\begin{document}
\resizebox{0.95\textwidth}{!}{
\begin{tikzpicture}
\newcommand\Square{+(-1,-1) rectangle +(1,1)}
\draw (0,0) rectangle (8,6);\node at (4,0.5) {$I_1$};
\node[label=$p$]  (p) at (3,4) {};
\draw [orange] plot [only marks, mark size=2.5, mark=*] coordinates {(3,4)};
\draw[fill =blue,fill opacity=0.1] (p)  \Square;

\draw (10,0) rectangle (18,6);\node at (14,0.5) {$I_2$};
\node[label=below:$p'$]  (p') at (12.5,2.7) {};
\draw [orange] plot [only marks, mark size=2.5, mark=*] coordinates {(12.5,2.7)};

\draw[thick,->] (p) edge[bend right] (p');
\draw[fill =blue,fill opacity=0.1,rotate=50] (p') \Square;
\end{tikzpicture}}
\end{document}

在此处输入图片描述

结果不太令人满意。希望有人能帮忙。先谢谢了。

答案1

scope这可以通过使用s 和坐标变换轻松完成。

首先,不要使用“高级”坐标例程,只需执行以下操作:

\fill[orange] (3,4) circle (2.5pt);

其结果相同。

然后继续进行转变。

第二个矩形可以用相同的命令和scope

% Draw next rectangle, move everything 10cm to the right
\begin{scope}[xshift=10cm]

   \draw (0,0) rectangle (8,6);
   \node at (4,0.5) {$I_2$};
   \node[label=$p'$] (p') at (3,4) {};
   \fill[orange] (p') circle (2.5pt);

\end{scope}

现在讨论剩下的部分。

您可以对另一个进行操作scope并在该范围内转换坐标。
这可以使用构造来完成。它允许您为坐标cm={x,xy,yx,y,(coord)}创建矩阵转换。(x,y)

完整内容如下:

\begin{tikzpicture}[scale=.7]
  \newcommand\Square{+(-1,-1) rectangle +(1,1)}

  % Draw first rectangle and name
  \draw (0,0) rectangle (8,6);
  \node at (4,0.5) {$I_1$};
  \node[label=$p$]  (p) at (3,4) {};
  % Fill square
  \draw[fill=blue,fill opacity=0.1] (p) \Square;
  \draw[->,>=latex] (p) ++(-1,-1) -- ++(2.5,0);
  \draw[->,>=latex] (p) ++(-1,-1) -- ++(0,2.5);
  \fill[orange] (p) circle (2.5pt);

  % Draw next rectangle
  \begin{scope}[xshift=10cm]

    \draw (0,0) rectangle (8,6);
    \node at (4,0.5) {$I_2$};
    \node[label=$p'$] (p') at (3,4) {};
    \fill[orange] (p') circle (2.5pt);

    \begin{scope}[cm={.74,.74,-.74,.74,(0,0)}]
      \draw[->,>=latex] (p') ++(-1,-1) -- ++(2.5,0);
      \draw[->,>=latex] (p') ++(-1,-1) -- ++(0,2.5);
      \draw[fill=blue,fill opacity=0.1] (p') \Square;

    \end{scope}

  \end{scope}

  \draw[thick,->] (p) edge[bend right] (p');
\end{tikzpicture}

它产生了这个:

在此处输入图片描述

您可以轻松地调整转换中的不同元素。

答案2

您的意思是您的结果不令人满意,这取决于其代码还是外观?如果您想获得一些可以重用的代码,您可以执行以下操作。它使用 -environmentscope来执行shiftand rotate

\documentclass[tikz, border=5mm]{standalone}

\begin{document}
 \begin{tikzpicture}[very thick]
 \foreach \xoffset\lbl in {0/1,10/2} {
  \draw (\xoffset,0) rectangle ++(8,6) node [midway,below=2cm] {$I_\lbl$};
 }

 \newcommand{\Square}[4]{
  % Draw a square with {(x,y)}{rotation}{label}{name}
  \begin{scope}[shift={#1}, rotate=#2, >=latex]
   \draw [fill=blue!10!white] (-1,-1) rectangle (1,1) node [midway, circle, fill=orange, inner sep=2pt, label={90:{#3}}] (#4) {};
   \draw [<->] (1.5,-1) -- ++(-2.5,0) -- ++(0,2.5);
  \end{scope}
  }

  % Draw the squares and connect their centers
  \Square{(3,4)}{0}{$p$}{p1}
  \Square{(12,3)}{45}{$p'$}{p2}
  \draw [->] (p1) to [out=-75, in=195] (p2);
 \end{tikzpicture}
\end{document}

这样,您就可以\Square非常轻松地重复使用并将其作为节点引用。您可以根据需要添加其他参数(节点标签的旋转,...)。代码生成以下内容:

渲染图像

相关内容