[Tex/LaTex] Translate and rotate an object in TikZ (2D)

rotatingtikz-pgf

Is there a way in Tikz to translate and rotate a, lets say, rectangle by an arbitrary distance/angle?
As an example

  1. Translation: 3 in x-direction, 5 in y-direction
  2. Rotation: 45 degree

Now my goal would be drawing a rectangle around the origin and then be able to first translate then rotate the object and vice versa via TikZ commands. So one could visually see, that the translation and the rotation do not commute.

The translate first then rotate is easily done by hand but the other way around I need the help of a calculator.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale = 0.5]
\draw [->](-5,0) -- (5,0); %x-axis
\draw [->](0,-5) -- (0,5); %y-axis
\draw[green] (1,1) -- (1,-1) -- (-1,-1) -- (-1,1) -- (1,1); %square around the origin
\draw[blue] ($ (3,{5+sqrt(2)}) $) -- ($ ({3-sqrt(2)},5) $) -- ($ (3,{5-sqrt(2)})  $) -- ($ ({3+sqrt(2)},5) $) -- ($ (3,{5+sqrt(2)}) $) ;  %Rotation first, then translated, values calculated by hand
\draw[green, rotate around={45:(0,0)}] (2,6) rectangle (4,4); %neat solution for the RT case
\end{tikzpicture}
\end{document}

Best Answer

There are several method, as describle in the section Coordinate Transformations in the pgfmanual.

One way is to set a coordinate transformation matrix directly, via cm:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale = 0.5]
  \draw [->](-5,0) -- (5,0); %x-axis
  \draw [->](0,-5) -- (0,5); %y-axis
  \draw[green] (1,1) -- (1,-1) -- (-1,-1) -- (-1,1) -- (1,1); %square around the origin
  \draw[blue,cm={cos(45) ,-sin(45) ,sin(45) ,cos(45) ,(3 cm,5 cm)}] (1,1) -- (1,-1) -- (-1,-1) -- (-1,1) -- (1,1);
\end{tikzpicture}
\end{document}  

resulting picture

Be careful, you need to use this with the right order the transformations. With cm, you don't have the choice, it's always the rotation and then the translation. And the pgfmanual says: "Usually, you do not use this option directly."

A different solution is to use shift and rotate:

\draw[blue,shift={(3 cm,5 cm)},rotate=45] (1,1) -- (1,-1) -- (-1,-1) -- (-1,1) -- (1,1); 
\draw[orange,rotate=45,shift={(3 cm,5 cm)}] (1,1) -- (1,-1) -- (-1,-1) -- (-1,1) -- (1,1); 

(Comment by Caramdir:) For this you need to remember that TikZ composes transformations in the opposite order than the naturally expected one (i.e. it acts on the coordinate plane, not on the objects).

resulting picture