**Computer Graphics -- Adapted from a Visual Linear Algebra (VLA) Module by Eugene A. Herman and Michael D. Pepe**

> |
with(LinearAlgebra): with(plots): |

- Step 1. Translate the triangle so the vertex () is at the origin.
- Step 2. Rotate the translated figure 45 degrees about the origin.
- Step 3. Translate the figure back.

**Example 1**: The plot below shows a red triangle with vertices (), (), and () that has been translated up and to the right.

Our red triangle above can be represented using homogeneous coordinates by the matrix "triangle":

> |
triangle := Matrix([[4,4,6,4],[3,9,3,3],[1,1,1,1]]); |

Our translation can be represented in homogenous coordinates by the translation matrix which takes each vertex to it's translated point (up and to the right by the vector ):

> |
translation:=Matrix([[1,0,3],[0,1,2],[0,0,1]]); |

(1.1) |

> |
translation.triangle; |

(1.2) |

**Example 2**** :** Rotate the triangle figure counterclockwise 45 degrees about its top vertex, ().

**Solution:** We break the problem into the following three steps.

Each of these steps is accomplished (see below) by applying a matrix transformation in homogeneous coordinates. The product of the three matrices gives us a single matrix that accomplishes the desired rotation in one step.

Step 1. Translate the triangle so the vertex () is moved to the origin. We therefore translate the triangle by the vector .

> |
T := Matrix([[1, 0, -4], [0, 1, -9], [0, 0, 1]]); |

> |
T.triangle; |

Step 2. Rotate the translated figure 45 degrees. Apply this rotation matrix *R* to the translated triangle, which we call "triangle1".

> |
triangle1 := T.triangle; |

> |
R := Matrix([[cos(Pi/4), -sin(Pi/4), 0], [sin(Pi/4), cos(Pi/4), 0], [0, 0, 1]]); |

> |
R.triangle1; |

Step 3. Translate the figure so the top vertex is moved back from () to (). Apply this translation matrix *U* to the rotated triangle, which we call "triangle2". (Note that the translation matrices *T* and *U* are inverses of one another.)

> |
triangle2 := R.triangle1; |

> |
U:=Matrix([[1, 0, 4], [0, 1, 9], [0, 0, 1]]); |

> |
U.triangle2; |

Now we multiply all three matrices together (right to left, like functions) and thereby construct a single matrix that performs the rotation about the vertex () with a single multiplication.

> |
M := U.R.T; |

> |
U.R.T.triangle; |

====================

**Making Movies**

We can also apply the product matrix *M* repeatedly to create a simple animation: Here is a movie created by 20 frames of applying M:

Careful of the order - if I do T.R.U instead of U.R.T, we get

**Example 3****:** Homogeneous Coordinate Transformations in 3-space

We define the homogeneous coordinates for a point in to be . The geometric transformations of are then represented by 4 by 4 matrices. For example, here are transformations side by side with their homogeneous versions. Notice that, in each pair, the original transformation makes up the 3 by 3 block in the upper-left corner of the 4 by 4 matrix. The rest of the matrix is filled out with zeros, except for a 1 in the lower-right corner. What is the effect of each transformation in ?

We can also create homogeneous rotation matrices for :

> |
Matrix([[cos(theta), -sin(theta), 0, 0], [sin(theta), cos(theta), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]); |

This is no longer a rotation about the origin since this is not possible in : instead we rotate about the z-axis.

===================

**Example 4**: Let's rotate a 3-D figure by 30 degrees about the *z* axis.

> |
Rz := Matrix([[cos(Pi/6), -sin(Pi/6), 0, 0], [sin(Pi/6), cos(Pi/6), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]); |

Next, let's see what happens when this rotation is applied 12 times:

==================

**Example 5**: **Explore ~~** Here is an animation based on a composition of two matrices. Can you predict what the animation will look like before running it?

> |
T := Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 1], [0, 0, 0, 1]]); |

> |
Rz := Matrix([[cos(Pi/6), -sin(Pi/6), 0, 0], [sin(Pi/6), cos(Pi/6), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]); |

> |
M := Rz.T; |

24 frames: