1

I'm trying to extract the angle $[0 ... 2\pi]$ from a $3\times3$ homogeneous 2D transformation matrix. In fact I've found 2 very helpful posts at stackoverflow and stackexchange. $$A= \begin{pmatrix} a&b&tx\\ c&d&ty\\ 0&0&1 \end{pmatrix}$$ $$\mathrm{angle} = \arctan(c/d)$$

The thing is that I would like the angle to be in the range $[0 ... 2\pi]$. This means that the angle needs to be adjusted somewhat. I've discovered a pattern that seems to be working and I wonder if it makes any sense or if there is a more clever way to do this.

if scale x is flipped (or scale y, seems not to matter) and (-PI/2 < angle < PI/2)
    angle = angle + PI
elseif angle < 0
    angle = angle + 2PI
elseif angle > 0
    angle = angle // no change

1 Answers1

1

It is known that the standard matrix is of the form $$A=\begin{bmatrix}R&c\\0^T&1\end{bmatrix}$$ where $R$ is the $2\times2$ rotation matrix $$R=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{bmatrix}$$ and $c=(R+I)d$ with $d$ being the origin of the rotation.

Thus, you must have $\sin\theta=c$ and $\cos\theta=d$, which gives $\tan\theta=\frac{c}{d}$. This can be solved using the atan2 function which is implemented in many programming languages and software packages. This function is defined as $\newcommand{\atan}[2]{\arctan\left(\frac{#1}{#2}\right)}\DeclareMathOperator{\atant}{atan2}$ $$ \atant(x,y)=\begin{cases} \atan{y}{x}&x>0,y\geq0\\ \atan{y}{x}+\pi&x<0\\ \atan{y}{x}+2\pi&x>0,y<0\\ \frac{\pi}{2}&y>0,x=0\\ \frac{3\pi}{2}&y<0,x=0\\ \text{undefined}&x=0,y=0 \end{cases}. $$ This definition relies on $\arctan{x}$ lying in the domain $\left(\dfrac{-\pi}{2},\dfrac{\pi}{2}\right)$, which is the standard domain. The $\atant{x}$ function as defined above returns a result in the domain $(0,2\pi)$.

Daryl
  • 5,598