diff --git a/books/bookvol10.3.pamphlet b/books/bookvol10.3.pamphlet
index 2b20fdb..2297061 100644
--- a/books/bookvol10.3.pamphlet
+++ b/books/bookvol10.3.pamphlet
@@ -6,10 +6,30 @@
 \makeindex
 \usepackage{graphicx}
 %%
+%% Note that this file will eventually generate a dvi file
+%% which will eventually be processed by dvipdfm to create a pdf.
+%% The categories/domains/packages will be placed in a graphviz graph.
+%% The graphviz dot syntax allows an href parameter.
+%% The href parameter will reference this file. 
+%% pdf href syntax allows named destinations.
+%% This macro creates a named destination using \special
+%% Thus, you reference http://thispdf#nameddest=ABBREV 
+%% and you end up at the right page.
+%% This macro is called implicitly by \pagehead so every 
+%% category/domain/package can be referenced by fullname or abbrev.
+%%
+%% dest will give the ability to use nameddest= in html pdfs
+%%
+\newcommand{\dest}[1]{% e.g. \dest{abb}
+\special{pdf:dest (#1) [ @thispage /FitH @ypos ]}}
+%%
+%%
 %% pagehead consolidates standard page indexing
 %%
 \newcommand{\pagehead}[2]{% e.g. \pagehead{name}{abb}
-\section{#1}
+\dest{#1}%
+\dest{#2}%
+\subsection{{\bf #1} (#2)}
 \label{#1}%
 \label{#2}%
 \index{{#1}}%
@@ -17,20 +37,34 @@
 %%
 %% pagepic adds an image and an index entry
 %%
-\newcommand{\pagepic}[2]{% e.g. \pagepic{pathandfile}{abb}
-\includegraphics{#1}%
+\newcommand{\pagepic}[3]{% e.g. \pagepic{pathandfile}{abb}{scale}
+\includegraphics[scale=#3]{#1}%
 \index{images!#2}}
 %%
+%% \refto is a link to a referenced page that returns it arg
+%%
+\newcommand{\refto}[1]{% e.g. \refto{name}
+(p\pageref{#1}) #1}
+%%
 %% pageto is a forward link to a referenced page
 %%
 \newcommand{\pageto}[2]{% e.g. \pageto{abb}{name}
 \ \\${\bf\Rightarrow{}}${``#1''} (#2) \ref{#1} on page~\pageref{#1}}
 %%
-%% pageback is a backward link to a referencing page
+%% pagefrom is a backward link to a referencing page
 %%
 \newcommand{\pagefrom}[2]{% e.g. \pagefrom{name}{abb}
 \ \\${\bf\Leftarrow{}}${``#1''} (#2) \ref{#1} on page~\pageref{#1}}
 %%
+%% cross will put the category and function in the index
+%% cross will leave the funcname so it can be put inline.
+%%
+\newcommand{\cross}[2]{% e.g. \pagefrom{cat}{funcname}
+\index{#1!#2}%
+\index{#2!#1}%
+#2}
+
+
 % special meanings for math characters
 \providecommand{\N}{\mbox{\bbold N}}
 \providecommand{\Natural}{\mbox{\bbold N}}
@@ -43,6 +77,9 @@
 \providecommand{\Real}{\mbox{\bbold R}}
 \providecommand{\F}{{\mathcal F}}
 \providecommand{\R}{{\mathcal R}}
+\mathchardef\bigp="3250
+\mathchardef\bigq="3251
+\mathchardef\bigslash="232C
 \begin{document}
 \begin{titlepage}
 \center{\includegraphics{ps/axiomfront.ps}}
@@ -240,7 +277,1699 @@ November 10, 2003 ((iHy))
 \eject
 \pagenumbering{arabic}
 \setcounter{chapter}{0} % Chapter 1
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\pagehead{Domain}{ABB}
+%\pagepic{ps/v103domain.ps}{ABB}{1.00}
+\chapter{Chapter D}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Denavit-Hartenberg Matrices}
+\subsection{Homogeneous Transformations}
+The study of robot manipulation is concerned with the relationship between
+objects, and between objects and manipulators. In this chapter we will
+develop the representation necessary to describe these relationships. Similar
+problems of representation have already been solved in the field of computer
+graphics, where the relationship between objects must also be described.
+Homogeneous transformations are used in this field and in computer vision
+[Duda] [Robserts63] [Roberts65]. These transformations were employed by 
+Denavit to describe linkages [Denavit] and are now used to describe 
+manipulators [Pieper] [Paul72] [Paul77b].
+
+We will first establish notation for vectors and planes and then introduce
+transformations on them. These transformations consist primarily of
+translation and rotation. We will then show that these transformations
+can also be considered as coordinate frames in which to represent
+objects, including the manipulator. The inverse transformation will
+then be introduced. A later section describes the general rotation
+transformation representing a rotation about a vector. An algorithm is
+then described to find the equivalent axis and angle of rotations
+represented by any given transformation. A brief section on stretching
+and scaling transforms is included together with a section on the
+perspective transformation. The chapter concludes with a section on
+transformation equations.
+
+\subsection{Notation}
+
+In describing the relationship between objects we will make use of
+point vectors, planes, and coordinate frames. Point vectors are
+denoted by lower case, bold face characters. Planes are denoted by
+script characters, and coordinate frames by upper case, bold face
+characters. For example:
+
+\begin{tabular}{ll}
+vectors & {\bf v}, {\bf x1}, {\bf x} \\
+planes  & $\bigp$, $\bigq$ \\
+coordinate frames & {\bf I}, {\bf A}, {\bf CONV}\\
+\end{tabular}\\
+
+We will use point vectors, planes, and coordinate frames as variables
+which have associated values. For example, a point vector has as value
+its three Cartesian coordinate components.
+
+If we wish to describe a point in space, which we will call {\sl p},
+with respect to a coordinate frame {\bf E}, we will use a vector which
+we will call {\bf v}. We will write this as
+
+$$^E{\bf v}$$
+
+\noindent
+The leading superscript describes the defining coordinate frame.
+
+We might also wish to describe this same point, {\sl p}, with respect
+to a different coordinate frame, for example {\bf H}, using a vector
+{\bf w} as
+
+$$^H{\bf w}$$
+
+\noindent
+{\bf v} and {\bf w} are two vectors which probably have different
+component values and ${\bf v} \ne {\bf w}$ even though both vectors
+describe the same point {\sl p}. The case might also exist of a vector
+{\bf a} describing a point 3 inches above any frame
+
+$${^{F^1}}{\bf a}\qquad {^{F^2}}{\bf a}$$
+
+\noindent
+In this case the vectors are identical but describe different
+points. Frequently, the defining frame will be obvious from the text
+and the superscripts will be left off. In many cases the name of the
+vector will be the same as the name of the object described, for
+example, the tip of a pin might be described by a vector {\bf tip}
+with respect to a frame {\bf BASE} as
+
+$${^{BASE}}{\bf tip}$$
+
+\noindent
+If it were obvious from the text that we were describing the vector
+with respect to {\bf BASE} then we might simply write
+
+$${\bf tip}$$
+
+If we also wish to describe this point with respect to another
+coordinate frame say, {\bf HAND}, then we must use another vector to
+describe this relationship, for example
+
+$${^{HAND}{\bf tv}}$$
+
+\noindent
+${^{HAND}{\bf tv}}$ and {\bf tip} both describe the same feature but
+have different values. In order to refer to individual components of
+coordinate frames, point vectors, or planes, we add subscripts to
+indicate the particular component. For example, the vector
+${^{HAND}{\bf tv}}$ has components ${^{HAND}{\bf tv}}_{\bf x}$,
+${^{HAND}{\bf tv}}_{\bf y}$, ${^{HAND}{\bf tv}}_{\bf z}$.
+
+\subsection{Vectors}
+
+The homogeneous coordinate representation of objects in $n$-space
+is an $(n + 1)$-space entity such that a particular perspective
+projection recreates the $n$-space. This can also be viewed as the
+addition of an extra coordinate to each vector, a scale factor, such
+that the vector has the same meaning if each component, including the
+scale factor, is multiplied by a constant.
+
+A point vector
+
+$${\bf v} = a{\bf i} + b{\bf j} + c{\bf k}\eqno(1.1)$$
+
+\noindent
+where {\bf i}, {\bf j}, and {\bf k} are unit vectors along the $x$,
+$y$, and $z$ coordinate axes, respectively, is represented in
+homogeneous coordinates as a column matrix
+
+$${\bf v} = \left[\matrix{{\bf x}\cr
+                          {\bf y}\cr
+                          {\bf z}\cr
+                          {\bf w}\cr}
+            \right]\eqno(1.2)$$
+
+\noindent
+where
+
+$${{\bf a} = {\bf x}/{\bf w}}$$
+$${{\bf b} = {\bf y}/{\bf w}}\eqno(1.3)$$
+$${{\bf c} = {\bf z}/{\bf w}}$$
+
+\noindent
+Thus the vector $3{\bf i} + 4{\bf j} + 5{\bf k}$ can be represented as
+$[3,4,5,1]^{\rm T}$ or as $[6,8,10,2]^{\rm T}$ or again 
+as $[-30,-40,-50,-10]^{\rm T}$,
+etc. The superscript $T$ indicates the transpose of the row vector
+into a column vector. The vector at the origin, the null vector, is
+represented as $[0,0,0,n]^{\rm T}$ where $n$ is any non-zero scale
+factor. The vector $[0,0,0,0]^{\rm T}$ is undefined. Vectors of the form
+$[a,b,c,0]^{\rm T}$ represent vectors at infinity and are used to represent
+directions; the addition of any other finite vector does not change
+their value in any way.
+
+We will also make use of the vector dot and cross products. Given two
+vectors
+
+$${\bf a} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.4)$$
+$${\bf b} = b_x{\bf i} + b_y{\bf j} + b_z{\bf k}$$
+
+\noindent
+we define the vector dot product, indicated by ``$\cdot$'' as
+
+$${\bf a} \cdot {\bf b} = {a_x}{b_x} + {a_y}{b_y} + {a_z}{b_z}\eqno(1.5)$$
+
+\noindent
+The dot product of two vectors is a scalar. The cross product,
+indicated by an ``$\times$'', is another vector perpendicular to the
+plane formed by the vectors of the product and is defined by
+
+$${\bf a} \times {\bf b} = ({a_y}{b_z} - {a_z}{b_y}){\bf i} +
+                         ({a_z}{b_x} - {a_x}{b_z}){\bf j} +
+                         ({a_x}{b_y} - {a_y}{b_x}){\bf k}\eqno(1.6)$$
+
+\noindent
+This definition is easily remembered as the expansion of the
+determinant
+
+$${\bf a} \times {\bf b} = 
+  \left|\matrix{{\bf i}&{\bf j}&{\bf k}\cr
+                 {a_x}&{a_y}&{a_z}\cr
+                 {b_x}&{b_y}&{b_z}\cr}\right|\eqno(1.7)$$
+
+\subsection{Planes}
+A plane is represented as a row matrix
+
+$$\bigp=[a,b,c,d]\eqno(1.8)$$
+
+\noindent
+such that if a point {\bf v} lies in a plane $\bigp$ the matrix
+product
+
+$$\bigp{\bf v} = 0\eqno(1.9)$$
+
+\noindent
+or in expanded form
+
+$$xa + yb + zc + wd = 0\eqno(1.10)$$
+
+\noindent
+If we define a constant
+
+$$m = +\sqrt{a^2 + b^2 + c^2}\eqno(1.11)$$
+
+\noindent
+and divide Equation 1.10 by $wm$ we obtain
+
+$${x\over w}{a\over m} + {y\over w}{b\over m} + {z\over w}{c\over m} 
+   = -{d\over m}\eqno(1.12)$$
+
+\noindent
+The left hand side of Equation 1.12 is the vector dot product of two
+vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and 
+$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ and represents the
+directed distance of the point 
+$(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ along the vector\\
+$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$. The vector
+$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ can be interpreted as the
+outward pointing normal of a plane situated a distance $-d/m$ from the
+origin in the direction of the normal. Thus a plane $\bigp$ parallel
+to the $x$,$y$ plane, one unit along the $z$ axis, is represented as
+
+$${\rm {\ \ \ \ \ \ \ \ \ }} \bigp = [0,0,1,-1]\eqno(1.13)$$
+$${\rm {or\  as\ \ \ }} \bigp = [0,0,2,-2]\eqno(1.14)$$
+$${\rm {\ \ \ \ \ or\  as\ \ \ }} \bigp = [0,0,-100,100]\eqno(1.15)$$
+
+\noindent
+A point ${\bf v} = [10,20,1,1]$ should lie in this plane
+
+$$[0,0,-100,100]\left[\matrix{10\cr
+                              20\cr
+                               1\cr
+                               1\cr}
+                \right]
+     = 0\eqno(1.16)$$
+
+\noindent
+or
+
+$$[0,0,1,-1]\left[\matrix{ -5\cr
+                          -10\cr
+                          -.5\cr
+                          -.5\cr}
+             \right]
+     = 0\eqno(1.17)$$
+
+\noindent
+The point ${\bf v} = [0,0,2,1]$ lies above the plane
+
+$$[0,0,2,-2]\left[\matrix{0\cr
+                          0\cr
+                          2\cr
+                          1\cr}
+             \right]
+     = 2\eqno(1.18)$$
+
+and $\bigp{\bf v}$ is indeed positive, indicating that the point is
+outside the plane in the direction of the outward pointing normal. A
+point ${\bf v} = [0,0,0,1]$ lies below the plane
+
+$$[0,0,1,-1]\left[\matrix{0\cr
+                          0\cr
+                          0\cr
+                          1\cr}
+             \right]
+     = -1\eqno(1.19)$$
+
+\noindent
+The plane $[0,0,0,0]$ is undefined.
+
+\subsection{Transformations}
+
+\noindent
+A transformation of the space {\bf H} is a 4x4 matrix and can
+represent translation, rotation, stretching, and perspective
+transformations. Given a point {\bf u}, its transformation {\bf v} is
+represented by the matrix product
+
+$${\bf v} = {\bf H}{\bf u}\eqno(1.20)$$
+
+\noindent
+The corresponding plane transformation $\bigp$ to $\bigq$ is
+
+$$\bigq = \bigp{\bf H^{-1}}\eqno(1.21)$$
+
+\noindent
+as we requre that the condition
+
+$$\bigq{\bf v} = \bigp{\bf u}\eqno(1.22)$$
+
+\noindent
+is invariant under all transformations. To verify this we substitute
+from Equations 1.20 and 1.21 into the left hand side of 1.22 and we
+obtain on the right hand side ${\bf H^{-1}}{\bf H}$ which is the
+identity matrix {\bf I}
+
+$$\bigp{\bf H^{-1}}{\bf H}{\bf u} = \bigp{\bf u}\eqno(1.23)$$
+
+\subsection{Translation Transformation}
+
+\noindent
+The transformation {\bf H} corresponding to a translation by a vector
+$a{\bf i} + b{\bf j} + c{\bf k}$ is
+
+$${\bf H} = {\bf Trans(a,b,c)} = 
+   \left[\matrix{1&0&0&a\cr
+                 0&1&0&b\cr
+                 0&0&1&c\cr
+                 0&0&0&1\cr}
+   \right]\eqno(1.24)$$
+
+\noindent
+Given a vector ${\bf u} = [x,y,z,w]^{\rm T}$ the transformed vector {\bf v}
+is given by
+
+$${\bf H} = {\bf Trans(a,b,c)} = 
+   \left[\matrix{1&0&0&a\cr
+                 0&1&0&b\cr
+                 0&0&1&c\cr
+                 0&0&0&1\cr}
+   \right]
+   \left[\matrix{x\cr
+                 y\cr
+                 z\cr
+                 w\cr}
+   \right]\eqno(1.25)$$
+
+$${\bf v} = \left[\matrix{x + aw\cr
+                          y + bw\cr
+                          z + cw\cr
+                          w\cr}
+            \right]
+          = \left[\matrix{x/w + a\cr
+                          y/w + b\cr
+                          z/w + c\cr
+                          1\cr}
+            \right]\eqno(1.26)$$
+
+\noindent
+The translation may also be interpreted as the addition of the two
+vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and 
+$a{\bf i} + b{\bf j} + c{\bf k}$.
+
+Every element of a transformation matrix may be multiplied by a
+non-zero constant without changing the transformation, in the same
+manner as points and planes. Consider the vector $2{\bf i} + 3{\bf j}
++ 2{\bf k}$ translated by, or added to\\
+4{\bf i} - 3{\bf j} + 7{\bf k}
+
+$$\left[\matrix{6\cr
+                0\cr
+                9\cr
+                1\cr}
+  \right] =
+  \left[\matrix{1 & 0 & 0 & 4\cr
+                0 & 1 & 0 & -3\cr
+                0 & 0 & 1 & 7\cr
+                0 & 0 & 0 & 1\cr}
+  \right]
+  \left[\matrix{2\cr
+                3\cr
+                2\cr
+                1\cr}
+  \right]\eqno(1.27)$$
+
+\noindent
+If we multiply the transmation matrix elements by, say, -5, and the
+vector elements by 2, we obtain
+
+$$\left[\matrix{-60\cr
+                0\cr
+                -90\cr
+                -10\cr}
+  \right] =
+  \left[\matrix{-5 & 0 &  0 & -20\cr
+                0 & -5 &  0 &  15\cr
+                0 &  0 & -5 & -35\cr
+                0 &  0 &  0 &  -5\cr}
+  \right]
+  \left[\matrix{4\cr
+                6\cr
+                4\cr
+                2\cr}
+  \right]\eqno(1.28)$$
+
+\noindent
+which corresponds to the vector $[6,0,9,1]^{\rm T}$ as before. The point
+$[2,3,2,1]$ lies in the plane $[1,0,0,-2]$
+
+$$[1,0,0,-2]\left[\matrix{2\cr
+                          3\cr
+                          2\cr
+                          1\cr}
+            \right] = 0\eqno(1.29)$$
+
+\noindent
+The transformed point is, as we have already found, $[6,0,9,1]^{\rm T}$. We
+will now compute the transformed plane. The inverse of the transform
+is 
+
+$$\left[\matrix{1 & 0 & 0 & -4\cr
+                0 & 1 & 0 &  3\cr
+                0 & 0 & 1 & -7\cr
+                0 & 0 & 0 &  1\cr}\right]$$
+
+\noindent
+and the transformed plane
+
+$$[1\ 0\ 0\ -6] = [1\ 0\ 0\ -2]\left[\matrix{1 & 0 & 0 & -4\cr
+                                        0 & 1 & 0 &  3\cr
+                                        0 & 0 & 1 & -7\cr
+                                        0 & 0 & 0 &  1\cr}
+                         \right]\eqno(1.30)$$
+
+\noindent
+Once again the transformed point lies in the transformed plane
+
+$$[1\ 0\ 0\ -6] \left[\matrix{6\cr
+                              0\cr
+                              9\cr
+                              1\cr}\right] = 0\eqno(1.31)$$
+
+The general translation operation can be represented in Axiom as
+
+<<translate>>=
+    translate(x,y,z) ==
+     matrix(_
+      [[1,0,0,x],_
+       [0,1,0,y],_
+       [0,0,1,z],_
+       [0,0,0,1]])
+@
+\subsection{Rotation Transformations}
+
+\noindent
+The transformations corresponding to rotations about the $x$, $y$, and
+$z$ axes by an angle $\theta$ are
+
+$${\bf Rot(x,\theta)} = 
+    \left[\matrix{1 &             0 &              0 & 0\cr
+                  0 & {cos\ \theta} & {-sin\ \theta} & 0\cr
+                  0 & {sin\ \theta} & {cos\ \theta}  & 0\cr
+                  0 &             0 &              0 & 1}\right]
+   \eqno(1.32)$$
+
+Rotations can be described in Axiom as functions that return
+matrices. We can define a function for each of the rotation matrices
+that correspond to the rotations about each axis. Note that the
+sine and cosine functions in Axiom expect their argument to be in
+radians rather than degrees. This conversion is
+
+$$radians = {{degrees * \pi}\over{180}}$$
+
+\noindent
+The Axiom code for ${\bf Rot(x,degree)}$ is
+
+<<rotatex>>=
+    rotatex(degree) ==
+     angle := degree * pi() / 180::R
+     cosAngle := cos(angle)
+     sinAngle := sin(angle)
+     matrix(_
+      [[1,     0,           0,      0], _
+       [0, cosAngle, -sinAngle, 0], _
+       [0, sinAngle,  cosAngle, 0], _
+       [0,     0,           0,      1]])
+@
+
+$${\bf Rot(y,\theta)} = 
+    \left[\matrix{{cos\ \theta}  & 0 & {sin\ \theta} & 0\cr
+                               0 & 1 &             0 & 0\cr
+                  {-sin\ \theta} & 0 & {cos\ \theta} & 0\cr
+                               0 & 0 &             0 & 1\cr}\right]
+   \eqno(1.33)$$
+
+\noindent 
+The Axiom code for ${\bf Rot(y,degree)}$ is
+
+<<rotatey>>=
+    rotatey(degree) ==
+     angle := degree * pi() / 180::R
+     cosAngle := cos(angle)
+     sinAngle := sin(angle)
+     matrix(_
+      [[ cosAngle, 0, sinAngle, 0], _
+       [    0,       1,     0,      0], _
+       [-sinAngle, 0, cosAngle, 0], _
+       [    0,       0,     0,      1]])
+@
+
+$${\bf Rot(z,\theta)} = 
+    \left[\matrix{{cos\ \theta} & {-sin\ \theta} & 0 & 0\cr
+                  {sin\ \theta} &  {cos\ \theta} & 0 & 0\cr
+                              0 &              0 & 1 & 0\cr
+                              0 &              0 & 0 & 1}\right]
+   \eqno(1.34)$$
+
+\noindent 
+And the Axiom code for ${\bf Rot(z,degree)}$ is
+
+<<rotatez>>=
+    rotatez(degree) ==
+     angle := degree * pi() / 180::R
+     cosAngle := cos(angle)
+     sinAngle := sin(angle)
+     matrix(_
+      [[cosAngle, -sinAngle, 0, 0], _
+       [sinAngle,  cosAngle, 0, 0], _
+       [   0,           0,       1, 0], _
+       [   0,           0,       0, 1]])
+@
+\noindent
+Let us interpret these rotations by means of an example. Given a point
+${\bf u} = 7{\bf i} + 3{\bf j} + 2{\bf k}$ what is the effect of
+rotating it $90^\circ$ about the ${\bf z}$ axis to ${\bf v}$? The
+transform is obtained from Equation 1.34 with $sin\ \theta = 1$ and 
+$cos\ \theta = 0$. 
+
+$$\left[\matrix{-3\cr
+                 7\cr
+                 2\cr
+                 1\cr}
+  \right] =
+  \left[\matrix{0 & -1 &  0 & 0\cr
+                1 &  0 &  0 & 0\cr
+                0 &  0 &  1 & 0\cr
+                0 &  0 &  0 & 1\cr}
+  \right]
+  \left[\matrix{7\cr
+                3\cr
+                2\cr
+                1\cr}
+  \right]\eqno(1.35)$$
+
+\noindent
+Let us now rotate {\bf v} $90^\circ$ about the $y$ axis to 
+{\bf w}. The transform is obtained from Equation 1.33 and we have
+
+$$\left[\matrix{2\cr
+                7\cr
+                3\cr
+                1\cr}
+  \right] =
+  \left[\matrix{ 0 &  0 &  1 & 0\cr
+                 0 &  1 &  0 & 0\cr
+                -1 &  0 &  0 & 0\cr
+                 0 &  0 &  0 & 1\cr}
+  \right]
+  \left[\matrix{-3\cr
+                 7\cr
+                 2\cr
+                 1\cr}
+  \right]\eqno(1.36)$$
+
+\noindent
+If we combine these two rotations we have
+
+$${\rm \ \ \ \ \ \ \ } {\bf v} = {\bf Rot(z,90)}{\bf u}\eqno(1.37)$$
+
+$${\rm and\ \ \ } {\bf w} = {\bf Rot(y,90)}{\bf v}\eqno(1.38)$$
+
+\noindent
+Substituting for {\bf v} from Equation 1.37 into Equation 1.38 we
+obtain 
+
+$${\bf w} = {\bf Rot(y,90)}\ {\bf Rot(z,90)}\ {\bf u}\eqno(1.39)$$
+
+$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = 
+   \left[\matrix{ 0 & 0 & 1 & 0\cr
+                  0 & 1 & 0 & 0\cr
+                 -1 & 0 & 0 & 0\cr
+                  0 & 0 & 0 & 1}
+   \right]
+   \left[\matrix{0 & -1 & 0 & 0\cr
+                 1 &  0 & 0 & 0\cr
+                 0 &  0 & 1 & 0\cr
+                 0 &  0 & 0 & 1}
+   \right]\eqno(1.40)$$
+
+$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = 
+   \left[\matrix{0 &  0 & 1 & 0\cr
+                 1 &  0 & 0 & 0\cr
+                 0 &  1 & 0 & 0\cr
+                 0 &  0 & 0 & 1}
+   \right]\eqno(1.41)$$
+
+\noindent
+thus
+
+$${\bf w} = \left[\matrix{2\cr
+                          7\cr
+                          3\cr
+                          1}\right]
+          = \left[\matrix{0 & 0 & 1 & 0\cr
+                          1 & 0 & 0 & 0\cr
+                          0 & 1 & 0 & 0\cr
+                          0 & 0 & 0 & 1}\right]
+            \left[\matrix{7\cr
+                          3\cr
+                          2\cr
+                          1}\right]\eqno(1.42)$$
+
+\noindent
+as we obtained before.
+
+If we reverse the order of rotations and first rotate $90^\circ$ about
+the $y$ axis and then $90^\circ$ about the $z$ axis, we obtain a
+different position
+
+$${\bf Rot(z,90)}{\bf Rot(y,90)} =
+    \left[\matrix{0 & -1 & 0 & 0\cr
+                  1 &  0 & 0 & 0\cr
+                  0 &  0 & 1 & 0\cr
+                  0 &  0 & 0 & 1}
+    \right]
+    \left[\matrix{ 0 & 0 & 1 & 0\cr
+                   0 & 1 & 0 & 0\cr
+                  -1 & 0 & 0 & 0\cr
+                   0 & 0 & 0 & 1}
+    \right]
+  = \left[\matrix{ 0 & -1 & 0 & 0\cr
+                   0 &  0 & 1 & 0\cr
+                  -1 &  0 & 0 & 0\cr
+                   0 &  0 & 0 & 1}
+    \right]\eqno(1.43)$$
+
+\noindent
+and the point {\bf u} transforms into {\bf w} as
+
+$$\left[\matrix{-3\cr
+                 2\cr
+                -7\cr
+                 1}
+  \right]
+ = \left[\matrix{ 0 & -1 & 0 & 0\cr
+                  0 &  0 & 1 & 0\cr
+                 -1 &  0 & 0 & 0\cr
+                  0 &  0 & 0 & 1}
+   \right]
+   \left[\matrix{7\cr
+                 3\cr
+                 2\cr
+                 1}
+   \right]\eqno(1.44)$$
+
+\noindent
+We should expect this, as matrix multiplication is noncommutative.
+
+$${\bf A}{\bf B} \ne {\bf B}{\bf A}\eqno(1.45)$$
+
+We will now combine the original rotation with a translation 
+$4{\bf i}-3{\bf j}+7{\bf k}$. We obtain the translation from Equation
+1.27 and the rotation from Equation 1.41. The matrix expression is
+
+$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)}
+   = \left[\matrix{1 & 0 & 0 &  4\cr
+                   0 & 1 & 0 & -3\cr
+                   0 & 0 & 1 &  7\cr
+                   0 & 0 & 0 &  1}
+     \right]
+     \left[\matrix{0 & 0 & 1 & 0\cr
+                   1 & 0 & 0 & 0\cr
+                   0 & 1 & 0 & 0\cr
+                   0 & 0 & 0 & 1}
+     \right]
+   = \left[\matrix{0 & 0 & 1 &  4\cr
+                   1 & 0 & 0 & -3\cr
+                   0 & 1 & 0 &  7\cr
+                   0 & 0 & 0 &  1}
+     \right]\eqno(1.46)$$
+
+\noindent
+and our point ${\bf w} = 7{\bf i}+3{\bf j}+2{\bf k}$ transforms into
+{\bf x} as
+
+$$\left[\matrix{ 6\cr
+                 4\cr
+                10\cr
+                 1}
+  \right]
+ = \left[\matrix{0 & 0 & 1 &  4\cr
+                 1 & 0 & 0 & -3\cr
+                 0 & 1 & 0 &  7\cr
+                 0 & 0 & 0 &  1}
+  \right]
+  \left[\matrix{7\cr
+                3\cr
+                2\cr
+                1}
+  \right]\eqno(1.47)$$
+
+\subsection{Coordinate Frames}
+
+\noindent
+We can interpret the elements of the homogeneous transformation as
+four vectors describing a second coordinate frame. The vector
+$[0,0,0,1]^{\rm T}$ lies at the origin of the second coordinate frame. Its
+transformation corresponds to the right hand column of the
+transformation matrix. Consider the transform in Equation 1.47
+
+$$\left[\matrix{ 4\cr
+                -3\cr
+                 7\cr
+                 1}
+  \right]
+ = \left[\matrix{0 & 0 & 1 &  4\cr
+                 1 & 0 & 0 & -3\cr
+                 0 & 1 & 0 &  7\cr
+                 0 & 0 & 0 &  1}
+   \right]
+   \left[\matrix{0\cr
+                 0\cr
+                 0\cr
+                 1}
+   \right]\eqno(1.48)$$
+
+\noindent
+The transform of the null vector is $[4,-3,7,1]^{\rm T}$, the right
+hand column. If we transform vectors corresponding to unit vectors
+along the $x$, $y$, and $z$ axes, we obtain $[4,-2,7,1]^{\rm T}$,
+$[4,-3,8,1]^{\rm T}$, and $[5,-3,7,1]^{\rm T}$, respectively. Those
+four vectors form a coordinate frame.
+
+The direction of these unit vectors is formed by subtracting the
+vector representing the origin of this coordinate frame and extending
+the vectors to infinity by reducing their scale factors to zero. The
+direction of the $x$, $y$, and $z$ axes of this frame are
+$[0,1,0,0]^{\rm T}$, $[0,0,1,0]^{\rm T}$, and $[1,0,0,0]^{\rm T}$,
+respectively. These direction vectors correspond to the first three
+columns of the transformation matrix. The transformation matrix thus
+describes the three axis directions and the position of the origin of
+a coordinate frame rotated and translated away from the reference
+coordinate frame. When a vector is transformed, as in Equation 1.47,
+the original vector can be considered as a vector described in the
+coordinate frame. The transformed vector is the same vector described
+with respect to the reference coordinate frame.
+
+\subsection{Relative Transformations}
+
+\noindent
+The rotations and translations we have been describing have all been
+made with respect to the fixed reference coordinate frame. Thus, in
+the example given, 
+
+$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)}
+   = \left[\matrix{0 & 0 & 1 &  4\cr
+                   1 & 0 & 0 & -3\cr
+                   0 & 1 & 0 &  7\cr
+                   0 & 0 & 0 &  1}
+     \right]\eqno(1.49)$$
+
+\noindent
+the frame is first rotated around the reference $z$ axis by
+$90^\circ$, then rotated $90^\circ$ around the reference $y$ axis, and
+finally translated by $4{\bf i}-3{\bf j}+7{\bf k}$. We may also
+interpret the operation in the reverse order, from left to right, as
+follows: the object is first translated by 
+$4{\bf i}-3{\bf j}+7{\bf k}$; it is then rotated $90^\circ$ around the
+current frames axes, which in this case are the same as the reference
+axes; it is then rotated $90^\circ$ about the newly rotated (current)
+frames axes.
+
+In general, if we postmultiply a transform representing a frame by a
+second transformation describing a rotation and/or translation, we
+make that translation and/or rotation with respect to the frame axes
+described by the first transformation. If we premultiply the frame
+transformation by a transformation representing a translation and/or
+rotation, then that translation and/or rotation is made with respect to
+the base reference coordinate frame. Thus, given a frame {\bf C} and a
+transformation {\bf T}, corresponding to a rotation of $90^\circ$
+about the $z$ axis, and a translation of 10 units in the $x$
+direction, we obtain a new position {\bf X} when the change is made in
+the base coordinates ${\bf X} = {\bf T} {\bf C}$
+
+$$\left[\matrix{0 & 0 & 1 &  0\cr
+                1 & 0 & 0 & 20\cr
+                0 & 1 & 0 &  0\cr
+                0 & 0 & 0 &  1}
+  \right]
+ = \left[\matrix{0 & -1 & 0 & 10\cr
+                 1 &  0 & 0 &  0\cr
+                 0 &  0 & 1 &  0\cr
+                 0 &  0 & 0 &  1}
+  \right]
+  \left[\matrix{1 & 0 &  0 & 20\cr
+                0 & 0 & -1 & 10\cr
+                0 & 1 &  0 &  0\cr
+                0 & 0 &  0 &  1}
+  \right]\eqno(1.50)$$
+
+\noindent
+and a new position {\bf Y} when the change is made relative to the
+frame axes as ${\bf Y} = {\bf C} {\bf T}$
+
+$$\left[\matrix{0 & -1 &  0 & 30\cr
+                0 &  0 & -1 & 10\cr
+                1 &  0 &  0 &  0\cr
+                0 &  0 &  0 &  1}
+  \right]
+ = \left[\matrix{1 &  0 &  0 & 20\cr
+                 0 &  0 & -1 & 10\cr
+                 0 &  1 &  0 &  0\cr
+                 0 &  0 &  0 &  1}
+  \right]
+  \left[\matrix{0 & -1 &  0 & 10\cr
+                1 &  0 &  0 &  0\cr
+                0 &  0 &  1 &  0\cr
+                0 &  0 &  0 &  1}
+  \right]\eqno(1.51)$$
+
+\subsection{Objects}
+
+\noindent
+Transformations are used to describe the position and orientation of
+objects. An object is described by six points with respect to a
+coordinate frame fixed in the object.
+
+If we rotate the object $90^\circ$ about the $z$ axis and then
+$90^\circ$ about the $y$ axis, followed by a translation of four units
+in the $x$ direction, we can describe the transformation as
+
+$${\bf Trans(4,0,0)}{\bf Rot(y,90)}{\bf Rot(z,90)} =
+   \left[\matrix{0 & 0 & 1 & 4\cr
+                 1 & 0 & 0 & 0\cr
+                 0 & 1 & 0 & 0\cr
+                 0 & 0 & 0 & 1}
+   \right]\eqno(1.52)$$
+
+\noindent
+The transformation matrix represents the operation of rotation and
+translation on a coordinate frame originally aligned with the
+reference coordinate frame. We may transform the six points of the
+object as
+
+$$\left[\matrix{4 &  4 &  6 & 6 &  4 &  4\cr
+                1 & -1 & -1 & 1 &  1 & -1\cr
+                0 &  0 &  0 & 0 &  4 &  4\cr
+                1 &  1 &  1 & 1 &  1 &  1}
+  \right]
+ = \left[\matrix{0 & 0 & 1 & 4\cr
+                 1 & 0 & 0 & 0\cr
+                 0 & 1 & 0 & 0\cr
+                 0 & 0 & 0 & 1}
+  \right]
+  \left[\matrix{1 & -1 & -1 & 1 & 1 & -1\cr
+                0 &  0 &  0 & 0 & 4 &  4\cr
+                0 &  0 &  2 & 2 & 0 &  0\cr
+                1 &  1 &  1 & 1 & 1 &  1}
+  \right]\eqno(1.53)$$
+
+It can be seen that the object described bears the same fixed
+relationship to its coordinate frame, whose position and orientation
+are described by the transformation. Given an object described by a
+reference coordinate frame, and a transformation representing the
+position and orientation of the object's axes, the object can be
+simply reconstructed, without the necessity of transforming all the
+points, by noting the direction and orientation of key features with
+respect to the describing frame's coordinate axes. By drawing the
+transformed coordinate frame, the object can be related to the new
+axis directions.
+
+\subsection{Inverse Transformations}
+
+\noindent
+We are now in a position to develop the inverse transformation as the
+transform which carries the transformed coordinate frame back to the
+original frame. This is simply the description of the reference
+coordinate frame with respect to the transformed frame. Suppose the
+direction of the reference frame $x$ axis is $[0,0,1,0]^{\rm T}$ with
+respect to the transformed frame. The $y$ and $z$ axes are 
+$[1,0,0,0]^{\rm T}$ and $[0,1,0,0]^{\rm T}$, respectively. The
+location of the origin is $[0,0,-4,1]^{\rm T}$ with respect to the
+transformed frame and thus the inverse transformation is
+
+$${\bf T^{-1}} = \left[\matrix{0 & 1 & 0 &  0\cr
+                               0 & 0 & 1 &  0\cr
+                               1 & 0 & 0 & -4\cr
+                               0 & 0 & 0 &  1}
+                 \right]\eqno(1.54)$$
+
+\noindent
+That this is indeed the tranform inverse is easily verifyed by
+multiplying it by the transform {\bf T} to obtain the identity
+transform 
+
+$$\left[\matrix{1 & 0 & 0 & 0\cr
+                0 & 1 & 0 & 0\cr
+                0 & 0 & 1 & 0\cr
+                0 & 0 & 0 & 1}
+  \right]
+ = \left[\matrix{0 & 1 & 0 &  0\cr
+                 0 & 0 & 1 &  0\cr
+                 1 & 0 & 0 & -4\cr
+                 0 & 0 & 0 &  1}
+   \right]
+   \left[\matrix{0 & 0 & 1 & 4\cr
+                 1 & 0 & 0 & 0\cr
+                 0 & 1 & 0 & 0\cr
+                 0 & 0 & 0 & 1}
+   \right]\eqno(1.55)$$ 
+
+\noindent
+In general, given a transform with elements
+
+$${\bf T} = \left[\matrix{n_x & o_x & a_x & p_x\cr
+                          n_y & o_y & a_y & p_y\cr
+                          n_z & o_z & a_z & p_z\cr
+                            0 &   0 &   0 &   1}
+            \right]\eqno(1.56)$$
+
+\noindent
+then the inverse is
+
+$${\bf T^{-1}} = \left[\matrix{n_x & n_y & n_z & -{\bf p} \cdot {\bf n}\cr
+                               o_x & o_y & o_z & -{\bf p} \cdot {\bf o}\cr
+                               a_x & a_y & a_z & -{\bf p} \cdot {\bf a}\cr
+                                 0 &   0 &   0 &   1}
+                 \right]\eqno(1.57)$$
+
+\noindent
+where {\bf p}, {\bf n}, {\bf o}, and {\bf a} are the four column
+vectors and ``$\cdot$'' represents the vector dot product. This result
+is easily verified by postmultiplying Equation 1.56 by Equation 1.57.
+
+\subsection{General Rotation Transformation}
+
+\noindent
+We state the rotation transformations for rotations about the $x$,
+$y$, and $z$ axes (Equations 1.32, 1.33 and 1.34). These
+transformations have a simple geometric interpretation. For example,
+in the case of a rotation about the $z$ axis, the column representing
+the $z$ axis will remain constant, while the column elements
+representing the $x$ and $y$ axes will vary.
+
+\noindent
+We will now develop the transformation matrix representing a rotation
+around an arbitrary vector {\bf k} located at the origin. In order to
+do this we will imagine that {\bf k} is the $z$ axis unit vector of a
+coordinate frame {\bf C} 
+
+$${\bf C} = \left[\matrix{n_x & o_x & a_x & p_x\cr
+                          n_y & o_y & a_y & p_y\cr
+                          n_z & o_z & a_z & p_z\cr
+                            0 &   0 &   0 &   1}
+            \right]\eqno(1.58)$$
+
+$${\bf k} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.59)$$
+
+\noindent
+Rotating around the vector {\bf k} is then equivalent to rotating
+around the $z$ axis of the frame {\bf C}.
+
+$${\bf Rot(k,\theta)} = {\bf Rot(^C{\bf z},\theta)}\eqno(1.60)$$
+
+\noindent
+If we are given a frame {\bf T} described with respect to the
+reference coordinate frame, we can find a frame {\bf X} which
+describes the same frame with respect to frame {\bf C} as
+
+$${\bf T} = {\bf C} {\bf X}\eqno(1.61)$$
+
+\noindent
+where {\bf X} describes the position of {\bf T} with respect to frame
+{\bf C}. Solving for {\bf X} we obtain
+
+$${\bf X} = {\bf C^{-1}} {\bf T}\eqno(1.62)$$
+
+\noindent
+Rotation {\bf T} around {\bf k} is equivalent to rotating {\bf X}
+around the $z$ axis of frame {\bf C}
+
+$${\bf Rot(k,\theta)} {\bf T}
+    = {\bf C} {\bf Rot(z,\theta)} {\bf X}\eqno(1.63)$$
+
+$${\bf Rot(k,\theta)} {\bf T}
+    = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}} {\bf T}.\eqno(1.64)$$
+
+\noindent
+Thus
+
+$${\bf Rot(k,\theta)} 
+    = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}\eqno(1.65)$$
+
+\noindent
+However, we have only {\bf k}, the $z$ axis of the frame {\bf C}. By
+expanding equation 1.65 we will discover that 
+${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$ is a function of {\bf k}
+only. 
+
+Multiplying ${\bf Rot(z,\theta)}$ on the right by ${\bf C^{-1}}$ we
+obtain 
+
+$${\bf Rot(z,\theta)} {\bf C^{-1}}
+   = \left[\matrix{cos \theta & -sin \theta & 0 & 0\cr
+                   sin \theta &  cos \theta & 0 & 0\cr
+                            0 &           0 & 1 & 0\cr
+                            0 &           0 & 0 & 1}
+     \right]
+     \left[\matrix{n_x & n_y & n_z & 0\cr
+                   o_x & o_x & o_z & 0\cr
+                   a_x & a_y & a_z & 0\cr
+                     0 &   0 &   0 & 1}
+      \right]$$
+
+$$ = \left[\matrix{n_x cos \theta - o_x sin \theta & 
+                   n_y cos \theta - o_y sin \theta &
+                   n_z cos \theta - o_z sin \theta & 0\cr
+                   n_x sin \theta + o_x cos \theta &
+                   n_y sin \theta + o_y cos \theta &
+                   n_z sin \theta + o_z cos \theta & 0\cr
+                   a_x & a_y & a_z & 0\cr
+                     0 &   0 &   0 & 1}
+     \right]\eqno(1.66)$$
+
+\noindent
+premultiplying by
+
+$${\bf C} = \left[\matrix{n_x & o_x & a_x & 0\cr
+                          n_y & o_y & a_y & 0\cr
+                          n_z & o_z & a_z & 0\cr
+                            0 &   0 &   0 & 1}
+            \right]\eqno(1.67)$$
+
+\noindent
+we obtain ${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$
+
+$$\left[\matrix{
+n_x n_x cos \theta - n_x o_x sin \theta + n_x o_x sin \theta + o_x o_x
+cos \theta + a_x a_x\cr
+n_y n_x cos \theta - n_y o_x sin \theta + n_x o_y sin \theta + o_x o_y
+cos \theta + a_y a_x\cr
+n_z n_x cos \theta - n_z o_x sin \theta + n_x o_z sin \theta + o_x o_z
+cos \theta + a_z a_x\cr
+0}
+\right.$$
+
+$$\matrix{
+n_x n_y cos \theta - n_x o_y sin \theta + n_y o_x sin \theta + o_y o_x
+cos \theta + a_x a_y\cr
+n_y n_y cos \theta - n_y o_y sin \theta + n_y o_y sin \theta + o_y o_y
+cos \theta + a_y a_y\cr
+n_z n_y cos \theta - n_z o_y sin \theta + n_y o_z sin \theta + o_y o_z
+cos \theta + a_z a_y\cr
+0}\eqno(1.68)$$
+
+$$\left.\matrix{
+n_x n_z cos \theta - n_x o_z sin \theta + n_z o_x sin \theta + o_z o_x
+cos \theta + a_x a_x & 0\cr
+n_y n_z cos \theta - n_y o_z sin \theta + n_z o_y sin \theta + o_z o_y
+cos \theta + a_y a_z & 0\cr
+n_z n_z cos \theta - n_z o_z sin \theta + n_z o_z sin \theta + o_z o_z
+cos \theta + a_z a_z & 0\cr
+0 & 1}
+\right]$$
+
+\noindent
+Simplifying, using the following relationships:\\
+the dot product of any row or column of {\bf C} with any other row or
+column is zero, as the vectors are orthogonal;\\
+the dot product of any row or column of {\bf C} with itself is {\bf 1}
+as the vectors are of unit magnitude;\\
+the $z$ unit vector is the vector cross product of the $x$ and $y$
+vectors or
+$${\bf a} = {\bf n} \times {\bf o}\eqno(1.69)$$
+
+\noindent
+which has components
+
+$$a_x = n_y o_z - n_z o_y$$
+$$a_y = n_z o_x - n_x o_z$$
+$$a_z = n_x o_y - n_y o_x$$
+
+\noindent
+the versine, abbreviated ${\bf vers \ \theta}$, is defined as 
+${\bf vers \ \theta} = (1 - cos \ \theta)$,
+${k_x = a_x}$, ${k_y = a_y}$ and ${k_z = a_z}$. 
+We obtain ${\bf Rot(k,\theta)} =$
+$$\left[\matrix{
+k_x k_x vers \theta + cos \theta & 
+k_y k_x vers \theta - k_z sin \theta &
+k_z k_x vers \theta + k_y sin \theta & 
+0\cr
+k_x k_y vers \theta + k_z sin \theta &
+k_y k_y vers \theta + cos \theta &
+k_z k_y vers \theta - k_x sin \theta & 
+0\cr
+k_x k_z vers \theta - k_y sin \theta &
+k_y k_z vers \theta + k_x sin \theta &
+k_z k_z vers \theta + cos \theta &
+0\cr
+0 & 0 & 0 & 1}
+\right]\eqno(1.70)$$
+
+\noindent
+This is an important result and should be thoroughly understood before
+proceeding further.
+
+From this general rotation transformation we can obtain each of the
+elementary rotation transforms. For example ${\bf Rot(x,\theta)}$ is 
+${\bf Rot(k,\theta)}$ where ${k_x = 1}$, ${k_y = 0}$, and 
+${k_z = 0}$. Substituting these values of {\bf k} into Equation 1.70
+we obtain
+
+$${\bf Rot(x,\theta)} = 
+\left[\matrix{1 & 0 & 0 & 0\cr
+              0 & cos \theta & -sin \theta & 0\cr
+              0 & sin \theta &  cos \theta & 0\cr
+              0 &          0 &           0 & 1}
+\right]\eqno(1.71)$$
+
+\noindent
+as before.
+
+\subsection{Equivalent Angle and Axis of Rotation}
+
+\noindent
+Given any arbitrary rotational transformation, we can use Equation
+1.70 to obtain an axis about which an equivalent rotation $\theta$ is
+made as follows. Given a rotational transformation {\bf R}
+
+$${\bf R} = 
+\left[\matrix{n_x & o_x & a_x & 0\cr
+              n_y & o_y & a_y & 0\cr
+              n_z & o_z & a_z & 0\cr
+                0 &   0 &   0 & 1}
+\right]\eqno(1.72)$$
+
+\noindent
+we may equate {\bf R} to {\bf Rot(k,$\theta$)}
+
+$$\left[\matrix{n_x & o_x & a_x & 0\cr
+                n_y & o_y & a_y & 0\cr
+                n_z & o_z & a_z & 0\cr
+                  0 &   0 &   0 & 1}
+  \right] = $$
+$$\left[\matrix{
+k_x k_x vers \theta + cos \theta & 
+k_y k_x vers \theta - k_z sin \theta &
+k_z k_x vers \theta + k_y sin \theta & 
+0\cr
+k_x k_y vers \theta + k_z sin \theta &
+k_y k_y vers \theta + cos \theta &
+k_z k_y vers \theta - k_x sin \theta & 
+0\cr
+k_x k_z vers \theta - k_y sin \theta &
+k_y k_z vers \theta + k_x sin \theta &
+k_z k_z vers \theta + cos \theta &
+0\cr
+0 & 0 & 0 & 1}
+\right]\eqno(1.73)$$
+
+\noindent
+Summing the diagonal terms of Equation 1.73 we obtain
+
+$$n_x+o_y+a_z+1=
+k_x^2 vers \theta + cos \theta + 
+k_y^2 vers \theta + cos \theta +
+k_z^2 vers \theta + cos \theta + 1\eqno(1.74)$$
+
+$$\left.\matrix{ n_x+o_y+a_z & = & 
+                   (k_x^2+k_y^2+k_z^2)vers \theta + 3 cos \theta\cr
+                             & = & 1 + 2 cos \theta}
+  \right.\eqno(1.75)$$
+
+\noindent
+and the cosine of the angle of rotation is
+
+$$cos \theta = {1\over 2}(n_x+o_y+a_z-1)\eqno(1.76)$$
+
+\noindent
+Differencing pairs of off-diagonal terms in Equation 1.73 we obtain 
+
+$$o_z - a_y = 2 k_x sin \theta\eqno(1.77)$$
+$$a_x - n_z = 2 k_y sin \theta\eqno(1.78)$$
+$$n_y - o_x = 2 k_z sin \theta\eqno(1.79)$$
+
+\noindent
+Squaring and adding Equations 1.77-1.79 we obtain an expression for
+$sin \theta$
+
+$$(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2
+    = 4 sin^2 \theta\eqno(1.80)$$ 
+
+\noindent
+and the sine of the angle of rotation is
+
+$$sin \ \theta = 
+  \pm {1\over 2} \sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2}
+  \eqno(1.81)$$
+
+\noindent
+We may define the rotation to be positive about the vector {\bf k}
+such that $0 \leq \theta \leq 180^\circ$. In this case the $+$ sign
+is appropriate in Equation 1.81 and thus the angle of rotation
+$\theta$ is uniquely defined as
+
+$$tan \ \theta =
+ {\sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2}
+  \over
+  {(n_x + o_y + a_z -1)}}\eqno(1.82)$$
+
+\noindent
+The components of {\bf k} may be obtained from Equations 1.77-1.79 as
+
+$$k_x = {{o_z - a_y}\over{2 sin \theta}}\eqno(1.83)$$
+$$k_y = {{a_x - n_z}\over{2 sin \theta}}\eqno(1.84)$$
+$$k_z = {{n_y - o_x}\over{2 sin \theta}}\eqno(1.85)$$
+
+When the angle of rotation is very small, the axis of rotation is
+physically not well defined due to the small magnitude of both
+numerator and denominator in Equations 1.83-1.85. If the resulting
+angle is small, the vector {\bf k} should be renormalized to ensure
+that $\left|{\bf k}\right| = 1$. When the angle of rotation approaches
+$180^\circ$ the vector {\bf k} is once again poorly defined by
+Equation 1.83-1.85 as the magnitude of the sine is again
+decreasing. The axis of rotation is, however, physically well defined
+in this case. When $\theta < 150^\circ$, the denominator of
+Equations 1.83-1.85 is less than 1. As the angle increases to
+$180^\circ$ the rapidly decreasing magnitude of both numerator and
+denominator leads to considerable inaccuracies in the determination of
+{\bf k}. At $\theta = 180^\circ$, Equations 1.83-1.85 are of the form
+$0/0$, yielding no information at all about a physically well defined
+vector {\bf k}. If the angle of rotation is greater than $90^\circ$,
+then we must follow a different approach in determining {\bf
+k}. Equating the diagonal elements of Equation 1.73 we obtain
+
+$$k_x^2 vers \theta + cos \theta = n_x\eqno(1.86)$$
+$$k_y^2 vers \theta + cos \theta = o_y\eqno(1.87)$$
+$$k_z^2 vers \theta + cos \theta = a_z\eqno(1.88)$$
+
+Substituting for $cos \theta$ and $vers \theta$ from Equation 1.76 and
+solving for the elements of {\bf k} we obtain further
+
+$$k_x = 
+ \pm \sqrt{{{n_x - cos \theta}\over{1 - cos \theta}}}\eqno(1.89)$$
+$$k_y = 
+ \pm \sqrt{{{o_y - cos \theta}\over{1 - cos \theta}}}\eqno(1.90)$$
+$$k_z = 
+ \pm \sqrt{{{a_z - cos \theta}\over{1 - cos \theta}}}\eqno(1.91)$$
+
+\noindent
+The largest component of {\bf k} defined by Equations 1.89-1.91
+corresponds to the most positive component of $n_x$, $o_y$, and
+$a_z$. For this largest element, the sign of the radical can be
+obtained from Equations 1.77-1.79. As the sine of the angle of
+rotation $\theta$ must be positive, then the sign of the component of
+{\bf k} defined by Equations 1.77-1.79 must be the same as the sign of
+the left hand side of these equations. Thus we may combine Equations
+1.89-1.91 with the information contained in Equations 1.77-1.79 as
+follows 
+
+$$k_x = sgn(o_z-a_y)\sqrt{{{(n_x-cos \theta)}
+                          \over
+                          {1-cos \theta}}}\eqno(1.92)$$ 
+
+$$k_y = sgn(a_x-n_z)\sqrt{{{(o_y-cos \theta)}
+                          \over
+                          {1-cos \theta}}}\eqno(1.93)$$
+
+$$k_z = sgn(n_y-o_x)\sqrt{{{(a_z-cos \theta)}
+                          \over
+                          {1-cos \theta}}}\eqno(1.94)$$
+
+\noindent
+where $sgn(e) = +1$ if $e \ge 0$ and $sgn(e) = -1$ if $e \le 0$.
+
+Only the largest element of {\bf k} is determined from Equations
+1.92-1.94, corresponding to the most positive element of $n_x$, $o_y$,
+and $a_z$. The remaining elements are more accurately determined by
+the following equations formed by summing pairs of off-diagonal
+elements of Equation 1.73
+
+$$n_y + o_x = 2 k_x k_y vers \theta\eqno(1.95)$$
+$$o_z + a_y = 2 k_y k_z vers \theta\eqno(1.96)$$
+$$n_z + a_x = 2 k_z k_x vers \theta\eqno(1.97)$$
+
+\noindent
+If $k_x$ is largest then
+
+$$k_y = {{n_y + o_x}\over{2 k_x vers \theta}} 
+  {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.98)$$
+
+$$k_z = {{a_x + n_z}\over{2 k_x vers \theta}} 
+  {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.99)$$
+
+\noindent
+If $k_y$ is largest then
+
+$$k_x = {{n_y + o_x}\over{2 k_y vers \theta}}
+  {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.100)$$
+
+$$k_z = {{o_z + a_y}\over{2 k_y vers \theta}}
+  {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.101)$$
+
+\noindent
+If $k_z$ is largest then
+
+$$k_x = {{a_x + n_z}\over{2 k_z vers \theta}}
+  {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.102)$$
+
+$$k_y = {{o_z + a_y}\over{2 k_z vers \theta}}
+  {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.103)$$
+
+\subsection{Example 1.1}
+
+\noindent
+Determine the equivalent axis and angle of rotation for the matrix
+given in Equations 1.41
+
+$${\bf Rot(y,90)}{\bf Rot(z,90)} 
+  = \left[\matrix{0 & 0 & 1 & 0\cr
+                  1 & 0 & 0 & 0\cr
+                  0 & 1 & 0 & 0\cr
+                  0 & 0 & 0 & 1}
+    \right]\eqno(1.104)$$
+
+\noindent
+We first determine ${\bf cos \ \theta}$ from Equation 1.76
+
+$$cos \theta = {{1}\over{2}}(0 + 0 + 0 - 1) 
+             = -{{1}\over{2}}\eqno(1.105)$$
+
+\noindent
+and $sin \ \theta$ from Equation 1.81
+
+$$sin \theta = {{1}\over{2}}\sqrt{(1-0)^2+(1-0)^2+(1-0)^2}
+             = {{\sqrt3}\over{2}}\eqno(1.106)$$
+
+\noindent
+Thus
+
+$$\theta = tan^{-1}\left({{\sqrt3}\over{2}}
+           \raise15pt\hbox{$\bigslash$}
+           {{-1}\over{2}}\right)
+         = 120^\circ\eqno(1.107)$$
+
+\noindent
+As $\theta > 90$, we determine the largest component of {\bf k}
+corresponding to the largest element on the diagonal. As all diagonal
+elements are equal in this example we may pick any one. We will pick
+$k_x$ given by Equation 1.92
+
+$$k_x = +\sqrt{(0 + {{1}\over{2}})
+               \raise15pt\hbox{$\bigslash$}
+               (1 + {{1}\over{2}})}
+      = {{1}\over{\sqrt{3}}}\eqno(1.108)$$
+
+\noindent
+As we have determined $k_x$ we may now determine $k_y$ and $k_z$ from
+Equations 1.98 and 1.99, respectively
+
+$$k_y = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.109)$$
+
+$$k_z = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.110)$$
+
+\noindent
+In summary, then
+
+$${\bf Rot(y,90)}{\bf Rot(z,90)} = {\bf Rot(k,120)}\eqno(1.111)$$
+
+\noindent
+where
+
+$${\bf k} = {{1}\over{\sqrt{3}}} {\bf i}
+          + {{1}\over{\sqrt{3}}} {\bf j}
+          + {{1}\over{\sqrt{3}}} {\bf k}\eqno(1.112)$$
+
+Any combination of rotations is always equivalent to a single rotation
+about some axis {\bf k} by an angle $\theta$, an important result
+that we will make use of later.
+
+\subsection{Stretching and Scaling}
+
+A transform {\bf T} 
+
+$${\bf T} = \left[\matrix{a & 0 & 0 & 0\cr
+                          0 & b & 0 & 0\cr
+                          0 & 0 & c & 0\cr
+                          0 & 0 & 0 & 1}
+            \right]\eqno(1.113)$$
+
+\noindent
+will stretch objects uniformly along the $x$ axis by a factor $a$,
+along the $y$ axis by a factor $b$, and along the $z$ axis by a factor
+$c$. Consider any point on an object $x{\bf i}+y{\bf j}+z{\bf k}$; its
+tranform is
+
+$$\left[\matrix{ax\cr
+                by\cr
+                cz\cr
+                 1}
+  \right]
+  = \left[\matrix{a & 0 & 0 & 0\cr
+                  0 & b & 0 & 0\cr
+                  0 & 0 & c & 0\cr
+                  0 & 0 & 0 & 1}
+    \right]
+    \left[\matrix{x\cr
+                  y\cr
+                  z\cr
+                  1}
+    \right]\eqno(1.114)$$
+
+\noindent
+indicating stretching as stated. Thus a cube could be transformed into
+a rectangular parallelepiped by such a transform.
+
+The Axiom code to perform this scale change is:
+
+<<scale>>=
+    scale(scalex, scaley, scalez) ==
+     matrix(_
+      [[scalex, 0      ,0     , 0], _
+       [0     , scaley ,0     , 0], _
+       [0     , 0,      scalez, 0], _
+       [0     , 0,      0     , 1]])
+@
+\noindent
+The transform {\bf S} where
+
+$${\bf S} = \left[\matrix{s & 0 & 0 & 0\cr
+                          0 & s & 0 & 0\cr
+                          0 & 0 & s & 0\cr
+                          0 & 0 & 0 & 1}
+            \right]\eqno(1.115)$$
+
+\noindent
+will scale any object by the factor $s$.
+
+\subsection{Perspective Transformations}
+
+\noindent
+Consider the image formed of an object by a simple lens.
+
+The axis of the lens is along the $y$ axis for convenience. An object
+point $x$,$y$,$z$ is imaged at $x^\prime$,$y^\prime$,$z^\prime$ if the
+lens has a focal length $f$ ($f$ is considered positive). $y^\prime$
+represents the image distance and varies with object distance $y$. If
+we plot points on a plane perpendicular to the $y$ axis located at
+$y^\prime$ (the film plane in a camera), then a perspective image is
+formed. 
+
+We will first obtain values of $x^\prime$, $y^\prime$, and $z^\prime$,
+then introduce a perspective transformation and show that the same
+values are obtained.
+
+Based on the fact that a ray passing through the center of the lens is
+undeviated we may write
+
+$${\rm \ \ \ \ \ }{{z}\over{y}} = {{z^\prime}\over{y^\prime}}\eqno(1.116)$$
+
+$${\rm and\ } {{x}\over{y}} = {{x^\prime}\over{y^\prime}}\eqno(1.117)$$
+
+Based on the additional fact that a ray parallel to the lens axis
+passes through the focal point $f$, we may write
+
+$${\rm \ \ \ \ \ }{{z}\over{f}} 
+    = {{z^\prime}\over{y^\prime + f}}\eqno(1.118)$$
+
+$${\rm and\ } {{x}\over{f}} 
+    = {{x^\prime}\over{y^\prime + f}}\eqno(1.119)$$
+
+\noindent
+Notice that $x^\prime$, $y^\prime$, and $z^\prime$ are negative and
+that $f$ is positive. Eliminating $y^\prime$ between Equations 1.116
+and 1.118 we obtain
+
+$${{z}\over{f}} 
+    = {{z^\prime}\over{({{z^\prime y}\over{z}} + f)}}\eqno(1.120)$$
+
+\noindent
+and solving for $z^\prime$ we obtain the result
+
+$$z^\prime = {{z}\over{(1 - {{y}\over{f}})}}\eqno(1.121)$$
+
+\noindent
+Working with Equations 1.117 and 1.119 we can similarly obtain
+
+$$x^\prime = {{x}\over{(1 - {{y}\over{f}})}}\eqno(1.122)$$
+
+\noindent
+In order to obtain the image distance $y^\prime$ we rewrite Equations
+1.116 and 1.118 as
+
+$${{z}\over{z^\prime}} = {{y}\over{y^\prime}}\eqno(1.123)$$
+
+\noindent
+and
+
+$${{z}\over{z^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.124)$$
+
+\noindent
+thus
+
+$${{y}\over{y^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.125)$$
+
+\noindent
+and solving for $y^\prime$ we obtain the result
+
+$$y^\prime = {{y}\over{(1-{{y}\over{f}})}}\eqno(1.126)$$
+
+The homogeneous transformation {\bf P} which produces the same result
+is 
+
+$${\bf P} = \left[\matrix{1 & 0 & 0 & 0\cr
+                          0 & 1 & 0 & 0\cr
+                          0 & 0 & 1 & 0\cr
+                          0 & -{{1}\over{f}} & 0 & 1}
+            \right]\eqno(1.127)$$
+
+\noindent
+as any point $x{\bf i}+y{\bf j}+z{\bf k}$ transforms as
+
+$$\left[\matrix{x\cr
+                y\cr
+                z\cr
+                {1 - {{{y}\over{f}}}}}
+   \right]
+ = \left[\matrix{1 & 0 & 0 & 0\cr
+                 0 & 1 & 0 & 0\cr
+                 0 & 0 & 1 & 0\cr
+                 0 & -{{1}\over{f}} & 0 & 1}
+    \right]
+    \left[\matrix{x\cr
+                  y\cr
+                  z\cr
+                  1}
+    \right]\eqno(1.128)$$
+
+\noindent
+The image point $x^\prime$, $y^\prime$,, $z^\prime$, obtained by
+dividing through by the weight factor $(1 - {{y}\over{f}})$, is
+
+$${{x}\over{(1 - {{y}\over{f}})}}{\bf i} +
+  {{y}\over{(1 - {{y}\over{f}})}}{\bf j} +
+  {{z}\over{(1 - {{y}\over{f}})}}{\bf k} \eqno(1.129)$$
+
+\noindent
+This is the same result that we obtained above.
+
+A transform similar to {\bf P} but with $-{{1}\over{f}}$ at the bottom
+of the first column produces a perspective transformation along the
+$x$ axis. If the $-{{1}\over{f}}$ term is in the third column then the
+projection is along the $z$ axis.
+
+\subsection{Transform Equations}
+
+\noindent We will frequently be required to deal with transform
+equations in which a coordinate frame is described in two or more
+ways.  A manipulator is positioned with respect to base coordinates by
+a transform {\bf Z}. The end of the manipulator is described by a
+transform $^Z{\bf T}_6$, and the end effector is described by
+$^{T_6}{\bf E}$. An object is positioned with respect to base
+coordinates by a transform {\bf B}, and finally the manipulator end
+effector is positioned with respect to the object by $^B{\bf G}$. We
+have two descriptions of the position of the end effector, one with
+respect to the object and one with respect to the manipulator. As both
+positions are the same, we may equate the two descriptions
+
+$${\bf Z}{^Z{\bf T}_6}{^{T_6}{\bf E}}
+   = {\bf B}{^B{\bf G}}\eqno(1.130)$$
+
+If we wish to solve Equation 1.130 for the manipulator transform 
+${\bf T}_6$ we must premultiply Equation 1.130 by ${\bf Z}^{-1}$ and
+postmultiply by ${\bf E}^{-1}$ to obtain
+
+$${\bf T}_6 
+ = {{\bf Z}^{-1}} {\bf B} {\bf G} {{\bf E}^{-1}}\eqno(1.131)$$
+
+\noindent
+As a further example, consider that the position of the object {\bf B}
+is unknown, but that the manipulator is moved such that the end
+effector is positioned over the object correctly. We may then solve
+for {\bf B} from Equation 1.130 by postmultiplying by ${\bf G}^{-1}$.
+
+$${\bf B} = {\bf Z}{{\bf T}_6}{\bf E}{{\bf G}^{-1}}\eqno(1.133)$$
+
+\subsection{Summary}
+
+\noindent
+Homogeneous transformations may be readily used to describe the
+positions and orientations of coordinate frames in space. If a
+coordinate frame is embedded in an object then the position and
+orientation of the object are also readily described.
+
+The description of object A in terms of object B by means of a
+homogeneous transformation may be inverted to obtain the description
+of object B in terms of object A. This is not a property of a simple
+vector description of the relative displacement of one object with
+respect to another.
+
+Transformations may be interpreted as a product of rotation and
+translation transformations. If they are intrepreted from left to
+right, then the rotations and translations are in terms of the
+currently defined coordinate frame. If they are interpreted from right
+to left, then the rotations and translations are described with
+respect to the reference coordinate frame.
+
+Homogeneous transformations describe coordinate frames in terms of
+rectangular components, which are the sines and cosines of
+angles. This description may be related to rotations in which case the
+description is in terms of a vector and angle of rotation.
+
+\pagehead{DenavitHartenbergMatrix}{DHMATRIX}
+\pagepic{ps/v103denavithartenbergmatrix.ps}{DHMATRIX}{1.00}
+<<domain DHMATRIX DenavitHartenbergMatrix>>=
+
+++ 4x4 Matrices for coordinate transformations
+++ Author: Timothy Daly
+++ Date Created: June 26, 1991
+++ Date Last Updated: 26 June 1991
+++ Description:
+++   This package contains functions to create 4x4 matrices
+++   useful for rotating and transforming coordinate systems.
+++   These matrices are useful for graphics and robotics.
+++   (Reference: Robot Manipulators Richard Paul MIT Press 1981) 
+ 
+ 
+)abbrev domain DHMATRIX DenavitHartenbergMatrix
+ 
+--% DHMatrix
+
+DenavitHartenbergMatrix(R): Exports == Implementation where
+  ++ A Denavit-Hartenberg Matrix is a 4x4 Matrix of the form:
+  ++  \spad{nx ox ax px}
+  ++  \spad{ny oy ay py}
+  ++  \spad{nz oz az pz}
+  ++   \spad{0  0  0  1}
+  ++ (n, o, and a are the direction cosines)
+  R : Join(Field,  TranscendentalFunctionCategory)
+
+-- for the implementation of dhmatrix
+  minrow ==> 1
+  mincolumn ==> 1
+--
+  nx ==> x(1,1)::R
+  ny ==> x(2,1)::R
+  nz ==> x(3,1)::R
+  ox ==> x(1,2)::R
+  oy ==> x(2,2)::R
+  oz ==> x(3,2)::R
+  ax ==> x(1,3)::R
+  ay ==> x(2,3)::R
+  az ==> x(3,3)::R
+  px ==> x(1,4)::R
+  py ==> x(2,4)::R
+  pz ==> x(3,4)::R
+  row ==> Vector(R)
+  col ==> Vector(R)
+  radians ==> pi()/180
+
+  Exports ==> MatrixCategory(R,row,col) with
+   "*": (%, Point R) -> Point R
+     ++ t*p applies the dhmatrix t to point p
+   identity: () -> %
+     ++ identity() create the identity dhmatrix
+   rotatex: R -> %
+     ++ rotatex(r) returns a dhmatrix for rotation about axis X for r degrees
+   rotatey: R -> %
+     ++ rotatey(r) returns a dhmatrix for rotation about axis Y for r degrees
+   rotatez: R -> %
+     ++ rotatez(r) returns a dhmatrix for rotation about axis Z for r degrees
+   scale: (R,R,R) -> %
+     ++ scale(sx,sy,sz) returns a dhmatrix for scaling in the X, Y and Z
+     ++ directions
+   translate: (R,R,R) -> %
+     ++ translate(X,Y,Z) returns a dhmatrix for translation by X, Y, and Z
+ 
+  Implementation ==> Matrix(R) add
+
+    identity() == matrix([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])
+
+--    inverse(x) == (inverse(x pretend (Matrix R))$Matrix(R)) pretend %
+--    dhinverse(x) == matrix( _
+--        [[nx,ny,nz,-(px*nx+py*ny+pz*nz)],_
+--         [ox,oy,oz,-(px*ox+py*oy+pz*oz)],_
+--         [ax,ay,az,-(px*ax+py*ay+pz*az)],_
+--         [ 0, 0, 0, 1]])
+
+    d * p ==
+       v := p pretend Vector R
+       v := concat(v, 1$R)
+       v := d * v
+       point ([v.1, v.2, v.3]$List(R))
+
+<<rotatex>>
+
+<<rotatey>>
+
+<<rotatez>>
+
+<<scale>>
+
+<<translate>>
+ 
+@
+
+\chapter{Chunk collections}
+<<algebra>>=
+<<domain DHMATRIX DenavitHartenbergMatrix>>
+@
 \begin{thebibliography}{99}
 \end{thebibliography}
+\chapter{Index}
 \printindex
 \end{document}
diff --git a/books/ps/v103denavithartenbergmatrix.ps b/books/ps/v103denavithartenbergmatrix.ps
new file mode 100644
index 0000000..b796658
--- /dev/null
+++ b/books/ps/v103denavithartenbergmatrix.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 134 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 134 80
+%%PageOrientation: Portrait
+gsave
+36 36 98 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+96 42 lineto
+96 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+96 42 lineto
+96 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% CATEGORY
+[ /Rect [ 0 0 90 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=CATEGORY) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 90 36 moveto
+0 36 lineto
+0 0 lineto
+90 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 90 36 moveto
+0 36 lineto
+0 0 lineto
+90 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(CATEGORY)
+[9.12 9.36 8.64 8.64 10.08 10.08 8.4 10.08]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index e652236..f081683 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+20081114 tpd books/bookvol10.3 add DHMATRIX
+20081114 tpd src/algebra/Makefile remove dhmatrix.spad
+20081114 tpd books/ps/v103denavithartenbergmatrix.ps added
+20081114 tpd src/algebra/dhmatrix.spad merge with bookvol10.3
+20081114 tpd src/input/Makefile add dhmatrix.input
+20081114 tpd src/input/dhmatrix.input regression test DHMATRIX
 20081112 tpd books/bookvol10.2 add categories
 20081112 tpd books/ps/v102quaternioncategory.ps added
 20081112 tpd src/algebra/quat.spad move QUATCAT to bookvol10.2
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index e537f92..aef2cd2 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -172,7 +172,6 @@ LAYER0COPY=\
 \subsection{Layer 0}
 \subsubsection{Completed spad files}
 \begin{verbatim}
-dhmatrix.spad.pamphlet (DHMATRIX)
 print.spad.pamphlet   (PRINT)
 system.spad.pamphlet  (MSYSCMD)
 \end{verbatim}
@@ -485,7 +484,6 @@ carten.spad.pamphlet (GRMOD GRALG CARTEN CARTEN2)
 clifford.spad.pamphlet (QFORM CLIF)
 clip.spad.pamphlet (CLIP)
 coordsys.spad.pamphlet (COORDSYS)
-dhmatrix.spad.pamphlet (DHMATRIX)
 d02routine.spad.pamphlet (D02BBFA D02BHFA D02CJFA D02EJFA)
 ffpoly2.spad.pamphlet (FFPOLY2)
 irsn.spad.pamphlet (IRSN)
@@ -1189,7 +1187,7 @@ SPADFILES= \
  ${OUTSRC}/d03agents.spad ${OUTSRC}/d03package.spad \
  ${OUTSRC}/d03routine.spad ${OUTSRC}/d03.spad ${OUTSRC}/ddfact.spad \
  ${OUTSRC}/defaults.spad ${OUTSRC}/defintef.spad ${OUTSRC}/defintrf.spad \
- ${OUTSRC}/degred.spad ${OUTSRC}/derham.spad ${OUTSRC}/dhmatrix.spad \
+ ${OUTSRC}/degred.spad ${OUTSRC}/derham.spad  \
  ${OUTSRC}/divisor.spad ${OUTSRC}/dpolcat.spad ${OUTSRC}/drawopt.spad \
  ${OUTSRC}/drawpak.spad ${OUTSRC}/draw.spad \
  ${OUTSRC}/e01.spad ${OUTSRC}/e02.spad ${OUTSRC}/e04agents.spad \
@@ -1348,7 +1346,7 @@ DOCFILES= \
  ${DOC}/d03agents.spad.dvi ${DOC}/d03package.spad.dvi \
  ${DOC}/d03routine.spad.dvi ${DOC}/d03.spad.dvi ${DOC}/ddfact.spad.dvi \
  ${DOC}/defaults.spad.dvi ${DOC}/defintef.spad.dvi ${DOC}/defintrf.spad.dvi \
- ${DOC}/degred.spad.dvi ${DOC}/derham.spad.dvi ${DOC}/dhmatrix.spad.dvi \
+ ${DOC}/degred.spad.dvi ${DOC}/derham.spad.dvi  \
  ${DOC}/divisor.spad.dvi ${DOC}/dpolcat.spad.dvi ${DOC}/drawopt.spad.dvi \
  ${DOC}/drawpak.spad.dvi ${DOC}/draw.spad.dvi \
  ${DOC}/e01.spad.dvi ${DOC}/e02.spad.dvi ${DOC}/e04agents.spad.dvi \
diff --git a/src/algebra/dhmatrix.spad.pamphlet b/src/algebra/dhmatrix.spad.pamphlet
deleted file mode 100644
index 5c07599..0000000
--- a/src/algebra/dhmatrix.spad.pamphlet
+++ /dev/null
@@ -1,1741 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/algebra dhmatrix.spad}
-\author{Richard Paul and Timothy Daly}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\mathchardef\bigp="3250
-\mathchardef\bigq="3251
-\mathchardef\bigslash="232C
-\section{Homogeneous Transformations}
-The study of robot manipulation is concerned with the relationship between
-objects, and between objects and manipulators. In this chapter we will
-develop the representation necessary to describe these relationships. Similar
-problems of representation have already been solved in the field of computer
-graphics, where the relationship between objects must also be described.
-Homogeneous transformations are used in this field and in computer vision
-[Duda] [Robserts63] [Roberts65]. These transformations were employed by 
-Denavit to describe linkages [Denavit] and are now used to describe 
-manipulators [Pieper] [Paul72] [Paul77b].
-
-We will first establish notation for vectors and planes and then introduce
-transformations on them. These transformations consist primarily of
-translation and rotation. We will then show that these transformations
-can also be considered as coordinate frames in which to represent
-objects, including the manipulator. The inverse transformation will
-then be introduced. A later section describes the general rotation
-transformation representing a rotation about a vector. An algorithm is
-then described to find the equivalent axis and angle of rotations
-represented by any given transformation. A brief section on stretching
-and scaling transforms is included together with a section on the
-perspective transformation. The chapter concludes with a section on
-transformation equations.
-
-\section{Notation}
-
-In describing the relationship between objects we will make use of
-point vectors, planes, and coordinate frames. Point vectors are
-denoted by lower case, bold face characters. Planes are denoted by
-script characters, and coordinate frames by upper case, bold face
-characters. For example:
-
-\begin{tabular}{ll}
-vectors & {\bf v}, {\bf x1}, {\bf x} \\
-planes  & $\bigp$, $\bigq$ \\
-coordinate frames & {\bf I}, {\bf A}, {\bf CONV}\\
-\end{tabular}\\
-
-We will use point vectors, planes, and coordinate frames as variables
-which have associated values. For example, a point vector has as value
-its three Cartesian coordinate components.
-
-If we wish to describe a point in space, which we will call {\sl p},
-with respect to a coordinate frame {\bf E}, we will use a vector which
-we will call {\bf v}. We will write this as
-
-$$^E{\bf v}$$
-
-\noindent
-The leading superscript describes the defining coordinate frame.
-
-We might also wish to describe this same point, {\sl p}, with respect
-to a different coordinate frame, for example {\bf H}, using a vector
-{\bf w} as
-
-$$^H{\bf w}$$
-
-\noindent
-{\bf v} and {\bf w} are two vectors which probably have different
-component values and ${\bf v} \ne {\bf w}$ even though both vectors
-describe the same point {\sl p}. The case might also exist of a vector
-{\bf a} describing a point 3 inches above any frame
-
-$${^{F^1}}{\bf a}\qquad {^{F^2}}{\bf a}$$
-
-\noindent
-In this case the vectors are identical but describe different
-points. Frequently, the defining frame will be obvious from the text
-and the superscripts will be left off. In many cases the name of the
-vector will be the same as the name of the object described, for
-example, the tip of a pin might be described by a vector {\bf tip}
-with respect to a frame {\bf BASE} as
-
-$${^{BASE}}{\bf tip}$$
-
-\noindent
-If it were obvious from the text that we were describing the vector
-with respect to {\bf BASE} then we might simply write
-
-$${\bf tip}$$
-
-If we also wish to describe this point with respect to another
-coordinate frame say, {\bf HAND}, then we must use another vector to
-describe this relationship, for example
-
-$${^{HAND}{\bf tv}}$$
-
-\noindent
-${^{HAND}{\bf tv}}$ and {\bf tip} both describe the same feature but
-have different values. In order to refer to individual components of
-coordinate frames, point vectors, or planes, we add subscripts to
-indicate the particular component. For example, the vector
-${^{HAND}{\bf tv}}$ has components ${^{HAND}{\bf tv}}_{\bf x}$,
-${^{HAND}{\bf tv}}_{\bf y}$, ${^{HAND}{\bf tv}}_{\bf z}$.
-
-\section{Vectors}
-
-The homogeneous coordinate representation of objects in $n$-space
-is an $(n + 1)$-space entity such that a particular perspective
-projection recreates the $n$-space. This can also be viewed as the
-addition of an extra coordinate to each vector, a scale factor, such
-that the vector has the same meaning if each component, including the
-scale factor, is multiplied by a constant.
-
-A point vector
-
-$${\bf v} = a{\bf i} + b{\bf j} + c{\bf k}\eqno(1.1)$$
-
-\noindent
-where {\bf i}, {\bf j}, and {\bf k} are unit vectors along the $x$,
-$y$, and $z$ coordinate axes, respectively, is represented in
-homogeneous coordinates as a column matrix
-
-$${\bf v} = \left[\matrix{{\bf x}\cr
-                          {\bf y}\cr
-                          {\bf z}\cr
-                          {\bf w}\cr}
-            \right]\eqno(1.2)$$
-
-\noindent
-where
-
-$${{\bf a} = {\bf x}/{\bf w}}$$
-$${{\bf b} = {\bf y}/{\bf w}}\eqno(1.3)$$
-$${{\bf c} = {\bf z}/{\bf w}}$$
-
-\noindent
-Thus the vector $3{\bf i} + 4{\bf j} + 5{\bf k}$ can be represented as
-$[3,4,5,1]^{\rm T}$ or as $[6,8,10,2]^{\rm T}$ or again 
-as $[-30,-40,-50,-10]^{\rm T}$,
-etc. The superscript $T$ indicates the transpose of the row vector
-into a column vector. The vector at the origin, the null vector, is
-represented as $[0,0,0,n]^{\rm T}$ where $n$ is any non-zero scale
-factor. The vector $[0,0,0,0]^{\rm T}$ is undefined. Vectors of the form
-$[a,b,c,0]^{\rm T}$ represent vectors at infinity and are used to represent
-directions; the addition of any other finite vector does not change
-their value in any way.
-
-We will also make use of the vector dot and cross products. Given two
-vectors
-
-$${\bf a} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.4)$$
-$${\bf b} = b_x{\bf i} + b_y{\bf j} + b_z{\bf k}$$
-
-\noindent
-we define the vector dot product, indicated by ``$\cdot$'' as
-
-$${\bf a} \cdot {\bf b} = {a_x}{b_x} + {a_y}{b_y} + {a_z}{b_z}\eqno(1.5)$$
-
-\noindent
-The dot product of two vectors is a scalar. The cross product,
-indicated by an ``$\times$'', is another vector perpendicular to the
-plane formed by the vectors of the product and is defined by
-
-$${\bf a} \times {\bf b} = ({a_y}{b_z} - {a_z}{b_y}){\bf i} +
-                         ({a_z}{b_x} - {a_x}{b_z}){\bf j} +
-                         ({a_x}{b_y} - {a_y}{b_x}){\bf k}\eqno(1.6)$$
-
-\noindent
-This definition is easily remembered as the expansion of the
-determinant
-
-$${\bf a} \times {\bf b} = 
-  \left|\matrix{{\bf i}&{\bf j}&{\bf k}\cr
-                 {a_x}&{a_y}&{a_z}\cr
-                 {b_x}&{b_y}&{b_z}\cr}\right|\eqno(1.7)$$
-
-\section{Planes}
-A plane is represented as a row matrix
-
-$$\bigp=[a,b,c,d]\eqno(1.8)$$
-
-\noindent
-such that if a point {\bf v} lies in a plane $\bigp$ the matrix
-product
-
-$$\bigp{\bf v} = 0\eqno(1.9)$$
-
-\noindent
-or in expanded form
-
-$$xa + yb + zc + wd = 0\eqno(1.10)$$
-
-\noindent
-If we define a constant
-
-$$m = +\sqrt{a^2 + b^2 + c^2}\eqno(1.11)$$
-
-\noindent
-and divide Equation 1.10 by $wm$ we obtain
-
-$${x\over w}{a\over m} + {y\over w}{b\over m} + {z\over w}{c\over m} 
-   = -{d\over m}\eqno(1.12)$$
-
-\noindent
-The left hand side of Equation 1.12 is the vector dot product of two
-vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and 
-$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ and represents the
-directed distance of the point 
-$(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ along the vector\\
-$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$. The vector
-$(a/m){\bf i} + (b/m){\bf j} + (c/m){\bf k}$ can be interpreted as the
-outward pointing normal of a plane situated a distance $-d/m$ from the
-origin in the direction of the normal. Thus a plane $\bigp$ parallel
-to the $x$,$y$ plane, one unit along the $z$ axis, is represented as
-
-$${\rm {\ \ \ \ \ \ \ \ \ }} \bigp = [0,0,1,-1]\eqno(1.13)$$
-$${\rm {or\  as\ \ \ }} \bigp = [0,0,2,-2]\eqno(1.14)$$
-$${\rm {\ \ \ \ \ or\  as\ \ \ }} \bigp = [0,0,-100,100]\eqno(1.15)$$
-
-\noindent
-A point ${\bf v} = [10,20,1,1]$ should lie in this plane
-
-$$[0,0,-100,100]\left[\matrix{10\cr
-                              20\cr
-                               1\cr
-                               1\cr}
-                \right]
-     = 0\eqno(1.16)$$
-
-\noindent
-or
-
-$$[0,0,1,-1]\left[\matrix{ -5\cr
-                          -10\cr
-                          -.5\cr
-                          -.5\cr}
-             \right]
-     = 0\eqno(1.17)$$
-
-\noindent
-The point ${\bf v} = [0,0,2,1]$ lies above the plane
-
-$$[0,0,2,-2]\left[\matrix{0\cr
-                          0\cr
-                          2\cr
-                          1\cr}
-             \right]
-     = 2\eqno(1.18)$$
-
-and $\bigp{\bf v}$ is indeed positive, indicating that the point is
-outside the plane in the direction of the outward pointing normal. A
-point ${\bf v} = [0,0,0,1]$ lies below the plane
-
-$$[0,0,1,-1]\left[\matrix{0\cr
-                          0\cr
-                          0\cr
-                          1\cr}
-             \right]
-     = -1\eqno(1.19)$$
-
-\noindent
-The plane $[0,0,0,0]$ is undefined.
-
-\section{Transformations}
-
-\noindent
-A transformation of the space {\bf H} is a 4x4 matrix and can
-represent translation, rotation, stretching, and perspective
-transformations. Given a point {\bf u}, its transformation {\bf v} is
-represented by the matrix product
-
-$${\bf v} = {\bf H}{\bf u}\eqno(1.20)$$
-
-\noindent
-The corresponding plane transformation $\bigp$ to $\bigq$ is
-
-$$\bigq = \bigp{\bf H^{-1}}\eqno(1.21)$$
-
-\noindent
-as we requre that the condition
-
-$$\bigq{\bf v} = \bigp{\bf u}\eqno(1.22)$$
-
-\noindent
-is invariant under all transformations. To verify this we substitute
-from Equations 1.20 and 1.21 into the left hand side of 1.22 and we
-obtain on the right hand side ${\bf H^{-1}}{\bf H}$ which is the
-identity matrix {\bf I}
-
-$$\bigp{\bf H^{-1}}{\bf H}{\bf u} = \bigp{\bf u}\eqno(1.23)$$
-
-\section{Translation Transformation}
-
-\noindent
-The transformation {\bf H} corresponding to a translation by a vector
-$a{\bf i} + b{\bf j} + c{\bf k}$ is
-
-$${\bf H} = {\bf Trans(a,b,c)} = 
-   \left[\matrix{1&0&0&a\cr
-                 0&1&0&b\cr
-                 0&0&1&c\cr
-                 0&0&0&1\cr}
-   \right]\eqno(1.24)$$
-
-\noindent
-Given a vector ${\bf u} = [x,y,z,w]^{\rm T}$ the transformed vector {\bf v}
-is given by
-
-$${\bf H} = {\bf Trans(a,b,c)} = 
-   \left[\matrix{1&0&0&a\cr
-                 0&1&0&b\cr
-                 0&0&1&c\cr
-                 0&0&0&1\cr}
-   \right]
-   \left[\matrix{x\cr
-                 y\cr
-                 z\cr
-                 w\cr}
-   \right]\eqno(1.25)$$
-
-$${\bf v} = \left[\matrix{x + aw\cr
-                          y + bw\cr
-                          z + cw\cr
-                          w\cr}
-            \right]
-          = \left[\matrix{x/w + a\cr
-                          y/w + b\cr
-                          z/w + c\cr
-                          1\cr}
-            \right]\eqno(1.26)$$
-
-\noindent
-The translation may also be interpreted as the addition of the two
-vectors $(x/w){\bf i} + (y/w){\bf j} + (z/w){\bf k}$ and 
-$a{\bf i} + b{\bf j} + c{\bf k}$.
-
-Every element of a transformation matrix may be multiplied by a
-non-zero constant without changing the transformation, in the same
-manner as points and planes. Consider the vector $2{\bf i} + 3{\bf j}
-+ 2{\bf k}$ translated by, or added to\\
-4{\bf i} - 3{\bf j} + 7{\bf k}
-
-$$\left[\matrix{6\cr
-                0\cr
-                9\cr
-                1\cr}
-  \right] =
-  \left[\matrix{1 & 0 & 0 & 4\cr
-                0 & 1 & 0 & -3\cr
-                0 & 0 & 1 & 7\cr
-                0 & 0 & 0 & 1\cr}
-  \right]
-  \left[\matrix{2\cr
-                3\cr
-                2\cr
-                1\cr}
-  \right]\eqno(1.27)$$
-
-\noindent
-If we multiply the transmation matrix elements by, say, -5, and the
-vector elements by 2, we obtain
-
-$$\left[\matrix{-60\cr
-                0\cr
-                -90\cr
-                -10\cr}
-  \right] =
-  \left[\matrix{-5 & 0 &  0 & -20\cr
-                0 & -5 &  0 &  15\cr
-                0 &  0 & -5 & -35\cr
-                0 &  0 &  0 &  -5\cr}
-  \right]
-  \left[\matrix{4\cr
-                6\cr
-                4\cr
-                2\cr}
-  \right]\eqno(1.28)$$
-
-\noindent
-which corresponds to the vector $[6,0,9,1]^{\rm T}$ as before. The point
-$[2,3,2,1]$ lies in the plane $[1,0,0,-2]$
-
-$$[1,0,0,-2]\left[\matrix{2\cr
-                          3\cr
-                          2\cr
-                          1\cr}
-            \right] = 0\eqno(1.29)$$
-
-\noindent
-The transformed point is, as we have already found, $[6,0,9,1]^{\rm T}$. We
-will now compute the transformed plane. The inverse of the transform
-is 
-
-$$\left[\matrix{1 & 0 & 0 & -4\cr
-                0 & 1 & 0 &  3\cr
-                0 & 0 & 1 & -7\cr
-                0 & 0 & 0 &  1\cr}\right]$$
-
-\noindent
-and the transformed plane
-
-$$[1\ 0\ 0\ -6] = [1\ 0\ 0\ -2]\left[\matrix{1 & 0 & 0 & -4\cr
-                                        0 & 1 & 0 &  3\cr
-                                        0 & 0 & 1 & -7\cr
-                                        0 & 0 & 0 &  1\cr}
-                         \right]\eqno(1.30)$$
-
-\noindent
-Once again the transformed point lies in the transformed plane
-
-$$[1\ 0\ 0\ -6] \left[\matrix{6\cr
-                              0\cr
-                              9\cr
-                              1\cr}\right] = 0\eqno(1.31)$$
-
-The general translation operation can be represented in Axiom as
-
-<<translate>>=
-    translate(x,y,z) ==
-     matrix(_
-      [[1,0,0,x],_
-       [0,1,0,y],_
-       [0,0,1,z],_
-       [0,0,0,1]])
-@
-\section{Rotation Transformations}
-
-\noindent
-The transformations corresponding to rotations about the $x$, $y$, and
-$z$ axes by an angle $\theta$ are
-
-$${\bf Rot(x,\theta)} = 
-    \left[\matrix{1 &             0 &              0 & 0\cr
-                  0 & {cos\ \theta} & {-sin\ \theta} & 0\cr
-                  0 & {sin\ \theta} & {cos\ \theta}  & 0\cr
-                  0 &             0 &              0 & 1}\right]
-   \eqno(1.32)$$
-
-Rotations can be described in Axiom as functions that return
-matrices. We can define a function for each of the rotation matrices
-that correspond to the rotations about each axis. Note that the
-sine and cosine functions in Axiom expect their argument to be in
-radians rather than degrees. This conversion is
-
-$$radians = {{degrees * \pi}\over{180}}$$
-
-\noindent
-The Axiom code for ${\bf Rot(x,degree)}$ is
-
-<<rotatex>>=
-    rotatex(degree) ==
-     angle := degree * pi() / 180::R
-     cosAngle := cos(angle)
-     sinAngle := sin(angle)
-     matrix(_
-      [[1,     0,           0,      0], _
-       [0, cosAngle, -sinAngle, 0], _
-       [0, sinAngle,  cosAngle, 0], _
-       [0,     0,           0,      1]])
-@
-
-$${\bf Rot(y,\theta)} = 
-    \left[\matrix{{cos\ \theta}  & 0 & {sin\ \theta} & 0\cr
-                               0 & 1 &             0 & 0\cr
-                  {-sin\ \theta} & 0 & {cos\ \theta} & 0\cr
-                               0 & 0 &             0 & 1\cr}\right]
-   \eqno(1.33)$$
-
-\noindent 
-The Axiom code for ${\bf Rot(y,degree)}$ is
-
-<<rotatey>>=
-    rotatey(degree) ==
-     angle := degree * pi() / 180::R
-     cosAngle := cos(angle)
-     sinAngle := sin(angle)
-     matrix(_
-      [[ cosAngle, 0, sinAngle, 0], _
-       [    0,       1,     0,      0], _
-       [-sinAngle, 0, cosAngle, 0], _
-       [    0,       0,     0,      1]])
-@
-
-$${\bf Rot(z,\theta)} = 
-    \left[\matrix{{cos\ \theta} & {-sin\ \theta} & 0 & 0\cr
-                  {sin\ \theta} &  {cos\ \theta} & 0 & 0\cr
-                              0 &              0 & 1 & 0\cr
-                              0 &              0 & 0 & 1}\right]
-   \eqno(1.34)$$
-
-\noindent 
-And the Axiom code for ${\bf Rot(z,degree)}$ is
-
-<<rotatez>>=
-    rotatez(degree) ==
-     angle := degree * pi() / 180::R
-     cosAngle := cos(angle)
-     sinAngle := sin(angle)
-     matrix(_
-      [[cosAngle, -sinAngle, 0, 0], _
-       [sinAngle,  cosAngle, 0, 0], _
-       [   0,           0,       1, 0], _
-       [   0,           0,       0, 1]])
-@
-\noindent
-Let us interpret these rotations by means of an example. Given a point
-${\bf u} = 7{\bf i} + 3{\bf j} + 2{\bf k}$ what is the effect of
-rotating it $90^\circ$ about the ${\bf z}$ axis to ${\bf v}$? The
-transform is obtained from Equation 1.34 with $sin\ \theta = 1$ and 
-$cos\ \theta = 0$. 
-
-$$\left[\matrix{-3\cr
-                 7\cr
-                 2\cr
-                 1\cr}
-  \right] =
-  \left[\matrix{0 & -1 &  0 & 0\cr
-                1 &  0 &  0 & 0\cr
-                0 &  0 &  1 & 0\cr
-                0 &  0 &  0 & 1\cr}
-  \right]
-  \left[\matrix{7\cr
-                3\cr
-                2\cr
-                1\cr}
-  \right]\eqno(1.35)$$
-
-\noindent
-Let us now rotate {\bf v} $90^\circ$ about the $y$ axis to 
-{\bf w}. The transform is obtained from Equation 1.33 and we have
-
-$$\left[\matrix{2\cr
-                7\cr
-                3\cr
-                1\cr}
-  \right] =
-  \left[\matrix{ 0 &  0 &  1 & 0\cr
-                 0 &  1 &  0 & 0\cr
-                -1 &  0 &  0 & 0\cr
-                 0 &  0 &  0 & 1\cr}
-  \right]
-  \left[\matrix{-3\cr
-                 7\cr
-                 2\cr
-                 1\cr}
-  \right]\eqno(1.36)$$
-
-\noindent
-If we combine these two rotations we have
-
-$${\rm \ \ \ \ \ \ \ } {\bf v} = {\bf Rot(z,90)}{\bf u}\eqno(1.37)$$
-
-$${\rm and\ \ \ } {\bf w} = {\bf Rot(y,90)}{\bf v}\eqno(1.38)$$
-
-\noindent
-Substituting for {\bf v} from Equation 1.37 into Equation 1.38 we
-obtain 
-
-$${\bf w} = {\bf Rot(y,90)}\ {\bf Rot(z,90)}\ {\bf u}\eqno(1.39)$$
-
-$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = 
-   \left[\matrix{ 0 & 0 & 1 & 0\cr
-                  0 & 1 & 0 & 0\cr
-                 -1 & 0 & 0 & 0\cr
-                  0 & 0 & 0 & 1}
-   \right]
-   \left[\matrix{0 & -1 & 0 & 0\cr
-                 1 &  0 & 0 & 0\cr
-                 0 &  0 & 1 & 0\cr
-                 0 &  0 & 0 & 1}
-   \right]\eqno(1.40)$$
-
-$${\bf Rot(y,90)}\ {\bf Rot(z,90)} = 
-   \left[\matrix{0 &  0 & 1 & 0\cr
-                 1 &  0 & 0 & 0\cr
-                 0 &  1 & 0 & 0\cr
-                 0 &  0 & 0 & 1}
-   \right]\eqno(1.41)$$
-
-\noindent
-thus
-
-$${\bf w} = \left[\matrix{2\cr
-                          7\cr
-                          3\cr
-                          1}\right]
-          = \left[\matrix{0 & 0 & 1 & 0\cr
-                          1 & 0 & 0 & 0\cr
-                          0 & 1 & 0 & 0\cr
-                          0 & 0 & 0 & 1}\right]
-            \left[\matrix{7\cr
-                          3\cr
-                          2\cr
-                          1}\right]\eqno(1.42)$$
-
-\noindent
-as we obtained before.
-
-If we reverse the order of rotations and first rotate $90^\circ$ about
-the $y$ axis and then $90^\circ$ about the $z$ axis, we obtain a
-different position
-
-$${\bf Rot(z,90)}{\bf Rot(y,90)} =
-    \left[\matrix{0 & -1 & 0 & 0\cr
-                  1 &  0 & 0 & 0\cr
-                  0 &  0 & 1 & 0\cr
-                  0 &  0 & 0 & 1}
-    \right]
-    \left[\matrix{ 0 & 0 & 1 & 0\cr
-                   0 & 1 & 0 & 0\cr
-                  -1 & 0 & 0 & 0\cr
-                   0 & 0 & 0 & 1}
-    \right]
-  = \left[\matrix{ 0 & -1 & 0 & 0\cr
-                   0 &  0 & 1 & 0\cr
-                  -1 &  0 & 0 & 0\cr
-                   0 &  0 & 0 & 1}
-    \right]\eqno(1.43)$$
-
-\noindent
-and the point {\bf u} transforms into {\bf w} as
-
-$$\left[\matrix{-3\cr
-                 2\cr
-                -7\cr
-                 1}
-  \right]
- = \left[\matrix{ 0 & -1 & 0 & 0\cr
-                  0 &  0 & 1 & 0\cr
-                 -1 &  0 & 0 & 0\cr
-                  0 &  0 & 0 & 1}
-   \right]
-   \left[\matrix{7\cr
-                 3\cr
-                 2\cr
-                 1}
-   \right]\eqno(1.44)$$
-
-\noindent
-We should expect this, as matrix multiplication is noncommutative.
-
-$${\bf A}{\bf B} \ne {\bf B}{\bf A}\eqno(1.45)$$
-
-We will now combine the original rotation with a translation 
-$4{\bf i}-3{\bf j}+7{\bf k}$. We obtain the translation from Equation
-1.27 and the rotation from Equation 1.41. The matrix expression is
-
-$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)}
-   = \left[\matrix{1 & 0 & 0 &  4\cr
-                   0 & 1 & 0 & -3\cr
-                   0 & 0 & 1 &  7\cr
-                   0 & 0 & 0 &  1}
-     \right]
-     \left[\matrix{0 & 0 & 1 & 0\cr
-                   1 & 0 & 0 & 0\cr
-                   0 & 1 & 0 & 0\cr
-                   0 & 0 & 0 & 1}
-     \right]
-   = \left[\matrix{0 & 0 & 1 &  4\cr
-                   1 & 0 & 0 & -3\cr
-                   0 & 1 & 0 &  7\cr
-                   0 & 0 & 0 &  1}
-     \right]\eqno(1.46)$$
-
-\noindent
-and our point ${\bf w} = 7{\bf i}+3{\bf j}+2{\bf k}$ transforms into
-{\bf x} as
-
-$$\left[\matrix{ 6\cr
-                 4\cr
-                10\cr
-                 1}
-  \right]
- = \left[\matrix{0 & 0 & 1 &  4\cr
-                 1 & 0 & 0 & -3\cr
-                 0 & 1 & 0 &  7\cr
-                 0 & 0 & 0 &  1}
-  \right]
-  \left[\matrix{7\cr
-                3\cr
-                2\cr
-                1}
-  \right]\eqno(1.47)$$
-
-\section{Coordinate Frames}
-
-\noindent
-We can interpret the elements of the homogeneous transformation as
-four vectors describing a second coordinate frame. The vector
-$[0,0,0,1]^{\rm T}$ lies at the origin of the second coordinate frame. Its
-transformation corresponds to the right hand column of the
-transformation matrix. Consider the transform in Equation 1.47
-
-$$\left[\matrix{ 4\cr
-                -3\cr
-                 7\cr
-                 1}
-  \right]
- = \left[\matrix{0 & 0 & 1 &  4\cr
-                 1 & 0 & 0 & -3\cr
-                 0 & 1 & 0 &  7\cr
-                 0 & 0 & 0 &  1}
-   \right]
-   \left[\matrix{0\cr
-                 0\cr
-                 0\cr
-                 1}
-   \right]\eqno(1.48)$$
-
-\noindent
-The transform of the null vector is $[4,-3,7,1]^{\rm T}$, the right
-hand column. If we transform vectors corresponding to unit vectors
-along the $x$, $y$, and $z$ axes, we obtain $[4,-2,7,1]^{\rm T}$,
-$[4,-3,8,1]^{\rm T}$, and $[5,-3,7,1]^{\rm T}$, respectively. Those
-four vectors form a coordinate frame.
-
-The direction of these unit vectors is formed by subtracting the
-vector representing the origin of this coordinate frame and extending
-the vectors to infinity by reducing their scale factors to zero. The
-direction of the $x$, $y$, and $z$ axes of this frame are
-$[0,1,0,0]^{\rm T}$, $[0,0,1,0]^{\rm T}$, and $[1,0,0,0]^{\rm T}$,
-respectively. These direction vectors correspond to the first three
-columns of the transformation matrix. The transformation matrix thus
-describes the three axis directions and the position of the origin of
-a coordinate frame rotated and translated away from the reference
-coordinate frame. When a vector is transformed, as in Equation 1.47,
-the original vector can be considered as a vector described in the
-coordinate frame. The transformed vector is the same vector described
-with respect to the reference coordinate frame.
-
-\section{Relative Transformations}
-
-\noindent
-The rotations and translations we have been describing have all been
-made with respect to the fixed reference coordinate frame. Thus, in
-the example given, 
-
-$${\bf Trans(4,-3,7)}{\bf Rot(y,90)}{\bf Rot(z,90)}
-   = \left[\matrix{0 & 0 & 1 &  4\cr
-                   1 & 0 & 0 & -3\cr
-                   0 & 1 & 0 &  7\cr
-                   0 & 0 & 0 &  1}
-     \right]\eqno(1.49)$$
-
-\noindent
-the frame is first rotated around the reference $z$ axis by
-$90^\circ$, then rotated $90^\circ$ around the reference $y$ axis, and
-finally translated by $4{\bf i}-3{\bf j}+7{\bf k}$. We may also
-interpret the operation in the reverse order, from left to right, as
-follows: the object is first translated by 
-$4{\bf i}-3{\bf j}+7{\bf k}$; it is then rotated $90^\circ$ around the
-current frames axes, which in this case are the same as the reference
-axes; it is then rotated $90^\circ$ about the newly rotated (current)
-frames axes.
-
-In general, if we postmultiply a transform representing a frame by a
-second transformation describing a rotation and/or translation, we
-make that translation and/or rotation with respect to the frame axes
-described by the first transformation. If we premultiply the frame
-transformation by a transformation representing a translation and/or
-rotation, then that translation and/or rotation is made with respect to
-the base reference coordinate frame. Thus, given a frame {\bf C} and a
-transformation {\bf T}, corresponding to a rotation of $90^\circ$
-about the $z$ axis, and a translation of 10 units in the $x$
-direction, we obtain a new position {\bf X} when the change is made in
-the base coordinates ${\bf X} = {\bf T} {\bf C}$
-
-$$\left[\matrix{0 & 0 & 1 &  0\cr
-                1 & 0 & 0 & 20\cr
-                0 & 1 & 0 &  0\cr
-                0 & 0 & 0 &  1}
-  \right]
- = \left[\matrix{0 & -1 & 0 & 10\cr
-                 1 &  0 & 0 &  0\cr
-                 0 &  0 & 1 &  0\cr
-                 0 &  0 & 0 &  1}
-  \right]
-  \left[\matrix{1 & 0 &  0 & 20\cr
-                0 & 0 & -1 & 10\cr
-                0 & 1 &  0 &  0\cr
-                0 & 0 &  0 &  1}
-  \right]\eqno(1.50)$$
-
-\noindent
-and a new position {\bf Y} when the change is made relative to the
-frame axes as ${\bf Y} = {\bf C} {\bf T}$
-
-$$\left[\matrix{0 & -1 &  0 & 30\cr
-                0 &  0 & -1 & 10\cr
-                1 &  0 &  0 &  0\cr
-                0 &  0 &  0 &  1}
-  \right]
- = \left[\matrix{1 &  0 &  0 & 20\cr
-                 0 &  0 & -1 & 10\cr
-                 0 &  1 &  0 &  0\cr
-                 0 &  0 &  0 &  1}
-  \right]
-  \left[\matrix{0 & -1 &  0 & 10\cr
-                1 &  0 &  0 &  0\cr
-                0 &  0 &  1 &  0\cr
-                0 &  0 &  0 &  1}
-  \right]\eqno(1.51)$$
-
-\section{Objects}
-
-\noindent
-Transformations are used to describe the position and orientation of
-objects. An object is described by six points with respect to a
-coordinate frame fixed in the object.
-
-If we rotate the object $90^\circ$ about the $z$ axis and then
-$90^\circ$ about the $y$ axis, followed by a translation of four units
-in the $x$ direction, we can describe the transformation as
-
-$${\bf Trans(4,0,0)}{\bf Rot(y,90)}{\bf Rot(z,90)} =
-   \left[\matrix{0 & 0 & 1 & 4\cr
-                 1 & 0 & 0 & 0\cr
-                 0 & 1 & 0 & 0\cr
-                 0 & 0 & 0 & 1}
-   \right]\eqno(1.52)$$
-
-\noindent
-The transformation matrix represents the operation of rotation and
-translation on a coordinate frame originally aligned with the
-reference coordinate frame. We may transform the six points of the
-object as
-
-$$\left[\matrix{4 &  4 &  6 & 6 &  4 &  4\cr
-                1 & -1 & -1 & 1 &  1 & -1\cr
-                0 &  0 &  0 & 0 &  4 &  4\cr
-                1 &  1 &  1 & 1 &  1 &  1}
-  \right]
- = \left[\matrix{0 & 0 & 1 & 4\cr
-                 1 & 0 & 0 & 0\cr
-                 0 & 1 & 0 & 0\cr
-                 0 & 0 & 0 & 1}
-  \right]
-  \left[\matrix{1 & -1 & -1 & 1 & 1 & -1\cr
-                0 &  0 &  0 & 0 & 4 &  4\cr
-                0 &  0 &  2 & 2 & 0 &  0\cr
-                1 &  1 &  1 & 1 & 1 &  1}
-  \right]\eqno(1.53)$$
-
-It can be seen that the object described bears the same fixed
-relationship to its coordinate frame, whose position and orientation
-are described by the transformation. Given an object described by a
-reference coordinate frame, and a transformation representing the
-position and orientation of the object's axes, the object can be
-simply reconstructed, without the necessity of transforming all the
-points, by noting the direction and orientation of key features with
-respect to the describing frame's coordinate axes. By drawing the
-transformed coordinate frame, the object can be related to the new
-axis directions.
-
-\section{Inverse Transformations}
-
-\noindent
-We are now in a position to develop the inverse transformation as the
-transform which carries the transformed coordinate frame back to the
-original frame. This is simply the description of the reference
-coordinate frame with respect to the transformed frame. Suppose the
-direction of the reference frame $x$ axis is $[0,0,1,0]^{\rm T}$ with
-respect to the transformed frame. The $y$ and $z$ axes are 
-$[1,0,0,0]^{\rm T}$ and $[0,1,0,0]^{\rm T}$, respectively. The
-location of the origin is $[0,0,-4,1]^{\rm T}$ with respect to the
-transformed frame and thus the inverse transformation is
-
-$${\bf T^{-1}} = \left[\matrix{0 & 1 & 0 &  0\cr
-                               0 & 0 & 1 &  0\cr
-                               1 & 0 & 0 & -4\cr
-                               0 & 0 & 0 &  1}
-                 \right]\eqno(1.54)$$
-
-\noindent
-That this is indeed the tranform inverse is easily verifyed by
-multiplying it by the transform {\bf T} to obtain the identity
-transform 
-
-$$\left[\matrix{1 & 0 & 0 & 0\cr
-                0 & 1 & 0 & 0\cr
-                0 & 0 & 1 & 0\cr
-                0 & 0 & 0 & 1}
-  \right]
- = \left[\matrix{0 & 1 & 0 &  0\cr
-                 0 & 0 & 1 &  0\cr
-                 1 & 0 & 0 & -4\cr
-                 0 & 0 & 0 &  1}
-   \right]
-   \left[\matrix{0 & 0 & 1 & 4\cr
-                 1 & 0 & 0 & 0\cr
-                 0 & 1 & 0 & 0\cr
-                 0 & 0 & 0 & 1}
-   \right]\eqno(1.55)$$ 
-
-\noindent
-In general, given a transform with elements
-
-$${\bf T} = \left[\matrix{n_x & o_x & a_x & p_x\cr
-                          n_y & o_y & a_y & p_y\cr
-                          n_z & o_z & a_z & p_z\cr
-                            0 &   0 &   0 &   1}
-            \right]\eqno(1.56)$$
-
-\noindent
-then the inverse is
-
-$${\bf T^{-1}} = \left[\matrix{n_x & n_y & n_z & -{\bf p} \cdot {\bf n}\cr
-                               o_x & o_y & o_z & -{\bf p} \cdot {\bf o}\cr
-                               a_x & a_y & a_z & -{\bf p} \cdot {\bf a}\cr
-                                 0 &   0 &   0 &   1}
-                 \right]\eqno(1.57)$$
-
-\noindent
-where {\bf p}, {\bf n}, {\bf o}, and {\bf a} are the four column
-vectors and ``$\cdot$'' represents the vector dot product. This result
-is easily verified by postmultiplying Equation 1.56 by Equation 1.57.
-
-\section{General Rotation Transformation}
-
-\noindent
-We state the rotation transformations for rotations about the $x$,
-$y$, and $z$ axes (Equations 1.32, 1.33 and 1.34). These
-transformations have a simple geometric interpretation. For example,
-in the case of a rotation about the $z$ axis, the column representing
-the $z$ axis will remain constant, while the column elements
-representing the $x$ and $y$ axes will vary.
-
-\noindent
-We will now develop the transformation matrix representing a rotation
-around an arbitrary vector {\bf k} located at the origin. In order to
-do this we will imagine that {\bf k} is the $z$ axis unit vector of a
-coordinate frame {\bf C} 
-
-$${\bf C} = \left[\matrix{n_x & o_x & a_x & p_x\cr
-                          n_y & o_y & a_y & p_y\cr
-                          n_z & o_z & a_z & p_z\cr
-                            0 &   0 &   0 &   1}
-            \right]\eqno(1.58)$$
-
-$${\bf k} = a_x{\bf i} + a_y{\bf j} + a_z{\bf k}\eqno(1.59)$$
-
-\noindent
-Rotating around the vector {\bf k} is then equivalent to rotating
-around the $z$ axis of the frame {\bf C}.
-
-$${\bf Rot(k,\theta)} = {\bf Rot(^C{\bf z},\theta)}\eqno(1.60)$$
-
-\noindent
-If we are given a frame {\bf T} described with respect to the
-reference coordinate frame, we can find a frame {\bf X} which
-describes the same frame with respect to frame {\bf C} as
-
-$${\bf T} = {\bf C} {\bf X}\eqno(1.61)$$
-
-\noindent
-where {\bf X} describes the position of {\bf T} with respect to frame
-{\bf C}. Solving for {\bf X} we obtain
-
-$${\bf X} = {\bf C^{-1}} {\bf T}\eqno(1.62)$$
-
-\noindent
-Rotation {\bf T} around {\bf k} is equivalent to rotating {\bf X}
-around the $z$ axis of frame {\bf C}
-
-$${\bf Rot(k,\theta)} {\bf T}
-    = {\bf C} {\bf Rot(z,\theta)} {\bf X}\eqno(1.63)$$
-
-$${\bf Rot(k,\theta)} {\bf T}
-    = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}} {\bf T}.\eqno(1.64)$$
-
-\noindent
-Thus
-
-$${\bf Rot(k,\theta)} 
-    = {\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}\eqno(1.65)$$
-
-\noindent
-However, we have only {\bf k}, the $z$ axis of the frame {\bf C}. By
-expanding equation 1.65 we will discover that 
-${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$ is a function of {\bf k}
-only. 
-
-Multiplying ${\bf Rot(z,\theta)}$ on the right by ${\bf C^{-1}}$ we
-obtain 
-
-$${\bf Rot(z,\theta)} {\bf C^{-1}}
-   = \left[\matrix{cos \theta & -sin \theta & 0 & 0\cr
-                   sin \theta &  cos \theta & 0 & 0\cr
-                            0 &           0 & 1 & 0\cr
-                            0 &           0 & 0 & 1}
-     \right]
-     \left[\matrix{n_x & n_y & n_z & 0\cr
-                   o_x & o_x & o_z & 0\cr
-                   a_x & a_y & a_z & 0\cr
-                     0 &   0 &   0 & 1}
-      \right]$$
-
-$$ = \left[\matrix{n_x cos \theta - o_x sin \theta & 
-                   n_y cos \theta - o_y sin \theta &
-                   n_z cos \theta - o_z sin \theta & 0\cr
-                   n_x sin \theta + o_x cos \theta &
-                   n_y sin \theta + o_y cos \theta &
-                   n_z sin \theta + o_z cos \theta & 0\cr
-                   a_x & a_y & a_z & 0\cr
-                     0 &   0 &   0 & 1}
-     \right]\eqno(1.66)$$
-
-\noindent
-premultiplying by
-
-$${\bf C} = \left[\matrix{n_x & o_x & a_x & 0\cr
-                          n_y & o_y & a_y & 0\cr
-                          n_z & o_z & a_z & 0\cr
-                            0 &   0 &   0 & 1}
-            \right]\eqno(1.67)$$
-
-\noindent
-we obtain ${\bf C} {\bf Rot(z,\theta)} {\bf C^{-1}}$
-
-$$\left[\matrix{
-n_x n_x cos \theta - n_x o_x sin \theta + n_x o_x sin \theta + o_x o_x
-cos \theta + a_x a_x\cr
-n_y n_x cos \theta - n_y o_x sin \theta + n_x o_y sin \theta + o_x o_y
-cos \theta + a_y a_x\cr
-n_z n_x cos \theta - n_z o_x sin \theta + n_x o_z sin \theta + o_x o_z
-cos \theta + a_z a_x\cr
-0}
-\right.$$
-
-$$\matrix{
-n_x n_y cos \theta - n_x o_y sin \theta + n_y o_x sin \theta + o_y o_x
-cos \theta + a_x a_y\cr
-n_y n_y cos \theta - n_y o_y sin \theta + n_y o_y sin \theta + o_y o_y
-cos \theta + a_y a_y\cr
-n_z n_y cos \theta - n_z o_y sin \theta + n_y o_z sin \theta + o_y o_z
-cos \theta + a_z a_y\cr
-0}\eqno(1.68)$$
-
-$$\left.\matrix{
-n_x n_z cos \theta - n_x o_z sin \theta + n_z o_x sin \theta + o_z o_x
-cos \theta + a_x a_x & 0\cr
-n_y n_z cos \theta - n_y o_z sin \theta + n_z o_y sin \theta + o_z o_y
-cos \theta + a_y a_z & 0\cr
-n_z n_z cos \theta - n_z o_z sin \theta + n_z o_z sin \theta + o_z o_z
-cos \theta + a_z a_z & 0\cr
-0 & 1}
-\right]$$
-
-\noindent
-Simplifying, using the following relationships:\\
-the dot product of any row or column of {\bf C} with any other row or
-column is zero, as the vectors are orthogonal;\\
-the dot product of any row or column of {\bf C} with itself is {\bf 1}
-as the vectors are of unit magnitude;\\
-the $z$ unit vector is the vector cross product of the $x$ and $y$
-vectors or
-$${\bf a} = {\bf n} \times {\bf o}\eqno(1.69)$$
-
-\noindent
-which has components
-
-$$a_x = n_y o_z - n_z o_y$$
-$$a_y = n_z o_x - n_x o_z$$
-$$a_z = n_x o_y - n_y o_x$$
-
-\noindent
-the versine, abbreviated ${\bf vers \ \theta}$, is defined as 
-${\bf vers \ \theta} = (1 - cos \ \theta)$,
-${k_x = a_x}$, ${k_y = a_y}$ and ${k_z = a_z}$. 
-We obtain ${\bf Rot(k,\theta)} =$
-$$\left[\matrix{
-k_x k_x vers \theta + cos \theta & 
-k_y k_x vers \theta - k_z sin \theta &
-k_z k_x vers \theta + k_y sin \theta & 
-0\cr
-k_x k_y vers \theta + k_z sin \theta &
-k_y k_y vers \theta + cos \theta &
-k_z k_y vers \theta - k_x sin \theta & 
-0\cr
-k_x k_z vers \theta - k_y sin \theta &
-k_y k_z vers \theta + k_x sin \theta &
-k_z k_z vers \theta + cos \theta &
-0\cr
-0 & 0 & 0 & 1}
-\right]\eqno(1.70)$$
-
-\noindent
-This is an important result and should be thoroughly understood before
-proceeding further.
-
-From this general rotation transformation we can obtain each of the
-elementary rotation transforms. For example ${\bf Rot(x,\theta)}$ is 
-${\bf Rot(k,\theta)}$ where ${k_x = 1}$, ${k_y = 0}$, and 
-${k_z = 0}$. Substituting these values of {\bf k} into Equation 1.70
-we obtain
-
-$${\bf Rot(x,\theta)} = 
-\left[\matrix{1 & 0 & 0 & 0\cr
-              0 & cos \theta & -sin \theta & 0\cr
-              0 & sin \theta &  cos \theta & 0\cr
-              0 &          0 &           0 & 1}
-\right]\eqno(1.71)$$
-
-\noindent
-as before.
-
-\section{Equivalent Angle and Axis of Rotation}
-
-\noindent
-Given any arbitrary rotational transformation, we can use Equation
-1.70 to obtain an axis about which an equivalent rotation $\theta$ is
-made as follows. Given a rotational transformation {\bf R}
-
-$${\bf R} = 
-\left[\matrix{n_x & o_x & a_x & 0\cr
-              n_y & o_y & a_y & 0\cr
-              n_z & o_z & a_z & 0\cr
-                0 &   0 &   0 & 1}
-\right]\eqno(1.72)$$
-
-\noindent
-we may equate {\bf R} to {\bf Rot(k,$\theta$)}
-
-$$\left[\matrix{n_x & o_x & a_x & 0\cr
-                n_y & o_y & a_y & 0\cr
-                n_z & o_z & a_z & 0\cr
-                  0 &   0 &   0 & 1}
-  \right] = $$
-$$\left[\matrix{
-k_x k_x vers \theta + cos \theta & 
-k_y k_x vers \theta - k_z sin \theta &
-k_z k_x vers \theta + k_y sin \theta & 
-0\cr
-k_x k_y vers \theta + k_z sin \theta &
-k_y k_y vers \theta + cos \theta &
-k_z k_y vers \theta - k_x sin \theta & 
-0\cr
-k_x k_z vers \theta - k_y sin \theta &
-k_y k_z vers \theta + k_x sin \theta &
-k_z k_z vers \theta + cos \theta &
-0\cr
-0 & 0 & 0 & 1}
-\right]\eqno(1.73)$$
-
-\noindent
-Summing the diagonal terms of Equation 1.73 we obtain
-
-$$n_x+o_y+a_z+1=
-k_x^2 vers \theta + cos \theta + 
-k_y^2 vers \theta + cos \theta +
-k_z^2 vers \theta + cos \theta + 1\eqno(1.74)$$
-
-$$\left.\matrix{ n_x+o_y+a_z & = & 
-                   (k_x^2+k_y^2+k_z^2)vers \theta + 3 cos \theta\cr
-                             & = & 1 + 2 cos \theta}
-  \right.\eqno(1.75)$$
-
-\noindent
-and the cosine of the angle of rotation is
-
-$$cos \theta = {1\over 2}(n_x+o_y+a_z-1)\eqno(1.76)$$
-
-\noindent
-Differencing pairs of off-diagonal terms in Equation 1.73 we obtain 
-
-$$o_z - a_y = 2 k_x sin \theta\eqno(1.77)$$
-$$a_x - n_z = 2 k_y sin \theta\eqno(1.78)$$
-$$n_y - o_x = 2 k_z sin \theta\eqno(1.79)$$
-
-\noindent
-Squaring and adding Equations 1.77-1.79 we obtain an expression for
-$sin \theta$
-
-$$(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2
-    = 4 sin^2 \theta\eqno(1.80)$$ 
-
-\noindent
-and the sine of the angle of rotation is
-
-$$sin \ \theta = 
-  \pm {1\over 2} \sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2}
-  \eqno(1.81)$$
-
-\noindent
-We may define the rotation to be positive about the vector {\bf k}
-such that $0 \leq \theta \leq 180^\circ$. In this case the $+$ sign
-is appropriate in Equation 1.81 and thus the angle of rotation
-$\theta$ is uniquely defined as
-
-$$tan \ \theta =
- {\sqrt{(o_z - a_y)^2 + (a_x - n_z)^2 + (n_y - o_x)^2}
-  \over
-  {(n_x + o_y + a_z -1)}}\eqno(1.82)$$
-
-\noindent
-The components of {\bf k} may be obtained from Equations 1.77-1.79 as
-
-$$k_x = {{o_z - a_y}\over{2 sin \theta}}\eqno(1.83)$$
-$$k_y = {{a_x - n_z}\over{2 sin \theta}}\eqno(1.84)$$
-$$k_z = {{n_y - o_x}\over{2 sin \theta}}\eqno(1.85)$$
-
-When the angle of rotation is very small, the axis of rotation is
-physically not well defined due to the small magnitude of both
-numerator and denominator in Equations 1.83-1.85. If the resulting
-angle is small, the vector {\bf k} should be renormalized to ensure
-that $\left|{\bf k}\right| = 1$. When the angle of rotation approaches
-$180^\circ$ the vector {\bf k} is once again poorly defined by
-Equation 1.83-1.85 as the magnitude of the sine is again
-decreasing. The axis of rotation is, however, physically well defined
-in this case. When $\theta < 150^\circ$, the denominator of
-Equations 1.83-1.85 is less than 1. As the angle increases to
-$180^\circ$ the rapidly decreasing magnitude of both numerator and
-denominator leads to considerable inaccuracies in the determination of
-{\bf k}. At $\theta = 180^\circ$, Equations 1.83-1.85 are of the form
-$0/0$, yielding no information at all about a physically well defined
-vector {\bf k}. If the angle of rotation is greater than $90^\circ$,
-then we must follow a different approach in determining {\bf
-k}. Equating the diagonal elements of Equation 1.73 we obtain
-
-$$k_x^2 vers \theta + cos \theta = n_x\eqno(1.86)$$
-$$k_y^2 vers \theta + cos \theta = o_y\eqno(1.87)$$
-$$k_z^2 vers \theta + cos \theta = a_z\eqno(1.88)$$
-
-Substituting for $cos \theta$ and $vers \theta$ from Equation 1.76 and
-solving for the elements of {\bf k} we obtain further
-
-$$k_x = 
- \pm \sqrt{{{n_x - cos \theta}\over{1 - cos \theta}}}\eqno(1.89)$$
-$$k_y = 
- \pm \sqrt{{{o_y - cos \theta}\over{1 - cos \theta}}}\eqno(1.90)$$
-$$k_z = 
- \pm \sqrt{{{a_z - cos \theta}\over{1 - cos \theta}}}\eqno(1.91)$$
-
-\noindent
-The largest component of {\bf k} defined by Equations 1.89-1.91
-corresponds to the most positive component of $n_x$, $o_y$, and
-$a_z$. For this largest element, the sign of the radical can be
-obtained from Equations 1.77-1.79. As the sine of the angle of
-rotation $\theta$ must be positive, then the sign of the component of
-{\bf k} defined by Equations 1.77-1.79 must be the same as the sign of
-the left hand side of these equations. Thus we may combine Equations
-1.89-1.91 with the information contained in Equations 1.77-1.79 as
-follows 
-
-$$k_x = sgn(o_z-a_y)\sqrt{{{(n_x-cos \theta)}
-                          \over
-                          {1-cos \theta}}}\eqno(1.92)$$ 
-
-$$k_y = sgn(a_x-n_z)\sqrt{{{(o_y-cos \theta)}
-                          \over
-                          {1-cos \theta}}}\eqno(1.93)$$
-
-$$k_z = sgn(n_y-o_x)\sqrt{{{(a_z-cos \theta)}
-                          \over
-                          {1-cos \theta}}}\eqno(1.94)$$
-
-\noindent
-where $sgn(e) = +1$ if $e \ge 0$ and $sgn(e) = -1$ if $e \le 0$.
-
-Only the largest element of {\bf k} is determined from Equations
-1.92-1.94, corresponding to the most positive element of $n_x$, $o_y$,
-and $a_z$. The remaining elements are more accurately determined by
-the following equations formed by summing pairs of off-diagonal
-elements of Equation 1.73
-
-$$n_y + o_x = 2 k_x k_y vers \theta\eqno(1.95)$$
-$$o_z + a_y = 2 k_y k_z vers \theta\eqno(1.96)$$
-$$n_z + a_x = 2 k_z k_x vers \theta\eqno(1.97)$$
-
-\noindent
-If $k_x$ is largest then
-
-$$k_y = {{n_y + o_x}\over{2 k_x vers \theta}} 
-  {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.98)$$
-
-$$k_z = {{a_x + n_z}\over{2 k_x vers \theta}} 
-  {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.99)$$
-
-\noindent
-If $k_y$ is largest then
-
-$$k_x = {{n_y + o_x}\over{2 k_y vers \theta}}
-  {\rm \ \ \ \ \ from \ Equation \ 1.95}\eqno(1.100)$$
-
-$$k_z = {{o_z + a_y}\over{2 k_y vers \theta}}
-  {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.101)$$
-
-\noindent
-If $k_z$ is largest then
-
-$$k_x = {{a_x + n_z}\over{2 k_z vers \theta}}
-  {\rm \ \ \ \ \ from \ Equation \ 1.97}\eqno(1.102)$$
-
-$$k_y = {{o_z + a_y}\over{2 k_z vers \theta}}
-  {\rm \ \ \ \ \ from \ Equation \ 1.96}\eqno(1.103)$$
-
-\section{Example 1.1}
-
-\noindent
-Determine the equivalent axis and angle of rotation for the matrix
-given in Equations 1.41
-
-$${\bf Rot(y,90)}{\bf Rot(z,90)} 
-  = \left[\matrix{0 & 0 & 1 & 0\cr
-                  1 & 0 & 0 & 0\cr
-                  0 & 1 & 0 & 0\cr
-                  0 & 0 & 0 & 1}
-    \right]\eqno(1.104)$$
-
-\noindent
-We first determine ${\bf cos \ \theta}$ from Equation 1.76
-
-$$cos \theta = {{1}\over{2}}(0 + 0 + 0 - 1) 
-             = -{{1}\over{2}}\eqno(1.105)$$
-
-\noindent
-and $sin \ \theta$ from Equation 1.81
-
-$$sin \theta = {{1}\over{2}}\sqrt{(1-0)^2+(1-0)^2+(1-0)^2}
-             = {{\sqrt3}\over{2}}\eqno(1.106)$$
-
-\noindent
-Thus
-
-$$\theta = tan^{-1}\left({{\sqrt3}\over{2}}
-           \raise15pt\hbox{$\bigslash$}
-           {{-1}\over{2}}\right)
-         = 120^\circ\eqno(1.107)$$
-
-\noindent
-As $\theta > 90$, we determine the largest component of {\bf k}
-corresponding to the largest element on the diagonal. As all diagonal
-elements are equal in this example we may pick any one. We will pick
-$k_x$ given by Equation 1.92
-
-$$k_x = +\sqrt{(0 + {{1}\over{2}})
-               \raise15pt\hbox{$\bigslash$}
-               (1 + {{1}\over{2}})}
-      = {{1}\over{\sqrt{3}}}\eqno(1.108)$$
-
-\noindent
-As we have determined $k_x$ we may now determine $k_y$ and $k_z$ from
-Equations 1.98 and 1.99, respectively
-
-$$k_y = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.109)$$
-
-$$k_z = {{1+0}\over{\sqrt{3}}} = {{1}\over{\sqrt{3}}}\eqno(1.110)$$
-
-\noindent
-In summary, then
-
-$${\bf Rot(y,90)}{\bf Rot(z,90)} = {\bf Rot(k,120)}\eqno(1.111)$$
-
-\noindent
-where
-
-$${\bf k} = {{1}\over{\sqrt{3}}} {\bf i}
-          + {{1}\over{\sqrt{3}}} {\bf j}
-          + {{1}\over{\sqrt{3}}} {\bf k}\eqno(1.112)$$
-
-Any combination of rotations is always equivalent to a single rotation
-about some axis {\bf k} by an angle $\theta$, an important result
-that we will make use of later.
-
-\section{Stretching and Scaling}
-
-A transform {\bf T} 
-
-$${\bf T} = \left[\matrix{a & 0 & 0 & 0\cr
-                          0 & b & 0 & 0\cr
-                          0 & 0 & c & 0\cr
-                          0 & 0 & 0 & 1}
-            \right]\eqno(1.113)$$
-
-\noindent
-will stretch objects uniformly along the $x$ axis by a factor $a$,
-along the $y$ axis by a factor $b$, and along the $z$ axis by a factor
-$c$. Consider any point on an object $x{\bf i}+y{\bf j}+z{\bf k}$; its
-tranform is
-
-$$\left[\matrix{ax\cr
-                by\cr
-                cz\cr
-                 1}
-  \right]
-  = \left[\matrix{a & 0 & 0 & 0\cr
-                  0 & b & 0 & 0\cr
-                  0 & 0 & c & 0\cr
-                  0 & 0 & 0 & 1}
-    \right]
-    \left[\matrix{x\cr
-                  y\cr
-                  z\cr
-                  1}
-    \right]\eqno(1.114)$$
-
-\noindent
-indicating stretching as stated. Thus a cube could be transformed into
-a rectangular parallelepiped by such a transform.
-
-The Axiom code to perform this scale change is:
-
-<<scale>>=
-    scale(scalex, scaley, scalez) ==
-     matrix(_
-      [[scalex, 0      ,0     , 0], _
-       [0     , scaley ,0     , 0], _
-       [0     , 0,      scalez, 0], _
-       [0     , 0,      0     , 1]])
-@
-\noindent
-The transform {\bf S} where
-
-$${\bf S} = \left[\matrix{s & 0 & 0 & 0\cr
-                          0 & s & 0 & 0\cr
-                          0 & 0 & s & 0\cr
-                          0 & 0 & 0 & 1}
-            \right]\eqno(1.115)$$
-
-\noindent
-will scale any object by the factor $s$.
-
-\section{Perspective Transformations}
-
-\noindent
-Consider the image formed of an object by a simple lens.
-
-The axis of the lens is along the $y$ axis for convenience. An object
-point $x$,$y$,$z$ is imaged at $x^\prime$,$y^\prime$,$z^\prime$ if the
-lens has a focal length $f$ ($f$ is considered positive). $y^\prime$
-represents the image distance and varies with object distance $y$. If
-we plot points on a plane perpendicular to the $y$ axis located at
-$y^\prime$ (the film plane in a camera), then a perspective image is
-formed. 
-
-We will first obtain values of $x^\prime$, $y^\prime$, and $z^\prime$,
-then introduce a perspective transformation and show that the same
-values are obtained.
-
-Based on the fact that a ray passing through the center of the lens is
-undeviated we may write
-
-$${\rm \ \ \ \ \ }{{z}\over{y}} = {{z^\prime}\over{y^\prime}}\eqno(1.116)$$
-
-$${\rm and\ } {{x}\over{y}} = {{x^\prime}\over{y^\prime}}\eqno(1.117)$$
-
-Based on the additional fact that a ray parallel to the lens axis
-passes through the focal point $f$, we may write
-
-$${\rm \ \ \ \ \ }{{z}\over{f}} 
-    = {{z^\prime}\over{y^\prime + f}}\eqno(1.118)$$
-
-$${\rm and\ } {{x}\over{f}} 
-    = {{x^\prime}\over{y^\prime + f}}\eqno(1.119)$$
-
-\noindent
-Notice that $x^\prime$, $y^\prime$, and $z^\prime$ are negative and
-that $f$ is positive. Eliminating $y^\prime$ between Equations 1.116
-and 1.118 we obtain
-
-$${{z}\over{f}} 
-    = {{z^\prime}\over{({{z^\prime y}\over{z}} + f)}}\eqno(1.120)$$
-
-\noindent
-and solving for $z^\prime$ we obtain the result
-
-$$z^\prime = {{z}\over{(1 - {{y}\over{f}})}}\eqno(1.121)$$
-
-\noindent
-Working with Equations 1.117 and 1.119 we can similarly obtain
-
-$$x^\prime = {{x}\over{(1 - {{y}\over{f}})}}\eqno(1.122)$$
-
-\noindent
-In order to obtain the image distance $y^\prime$ we rewrite Equations
-1.116 and 1.118 as
-
-$${{z}\over{z^\prime}} = {{y}\over{y^\prime}}\eqno(1.123)$$
-
-\noindent
-and
-
-$${{z}\over{z^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.124)$$
-
-\noindent
-thus
-
-$${{y}\over{y^\prime}} = {{f}\over{y^\prime + f}}\eqno(1.125)$$
-
-\noindent
-and solving for $y^\prime$ we obtain the result
-
-$$y^\prime = {{y}\over{(1-{{y}\over{f}})}}\eqno(1.126)$$
-
-The homogeneous transformation {\bf P} which produces the same result
-is 
-
-$${\bf P} = \left[\matrix{1 & 0 & 0 & 0\cr
-                          0 & 1 & 0 & 0\cr
-                          0 & 0 & 1 & 0\cr
-                          0 & -{{1}\over{f}} & 0 & 1}
-            \right]\eqno(1.127)$$
-
-\noindent
-as any point $x{\bf i}+y{\bf j}+z{\bf k}$ transforms as
-
-$$\left[\matrix{x\cr
-                y\cr
-                z\cr
-                {1 - {{{y}\over{f}}}}}
-   \right]
- = \left[\matrix{1 & 0 & 0 & 0\cr
-                 0 & 1 & 0 & 0\cr
-                 0 & 0 & 1 & 0\cr
-                 0 & -{{1}\over{f}} & 0 & 1}
-    \right]
-    \left[\matrix{x\cr
-                  y\cr
-                  z\cr
-                  1}
-    \right]\eqno(1.128)$$
-
-\noindent
-The image point $x^\prime$, $y^\prime$,, $z^\prime$, obtained by
-dividing through by the weight factor $(1 - {{y}\over{f}})$, is
-
-$${{x}\over{(1 - {{y}\over{f}})}}{\bf i} +
-  {{y}\over{(1 - {{y}\over{f}})}}{\bf j} +
-  {{z}\over{(1 - {{y}\over{f}})}}{\bf k} \eqno(1.129)$$
-
-\noindent
-This is the same result that we obtained above.
-
-A transform similar to {\bf P} but with $-{{1}\over{f}}$ at the bottom
-of the first column produces a perspective transformation along the
-$x$ axis. If the $-{{1}\over{f}}$ term is in the third column then the
-projection is along the $z$ axis.
-
-\section{Transform Equations}
-
-\noindent We will frequently be required to deal with transform
-equations in which a coordinate frame is described in two or more
-ways.  A manipulator is positioned with respect to base coordinates by
-a transform {\bf Z}. The end of the manipulator is described by a
-transform $^Z{\bf T}_6$, and the end effector is described by
-$^{T_6}{\bf E}$. An object is positioned with respect to base
-coordinates by a transform {\bf B}, and finally the manipulator end
-effector is positioned with respect to the object by $^B{\bf G}$. We
-have two descriptions of the position of the end effector, one with
-respect to the object and one with respect to the manipulator. As both
-positions are the same, we may equate the two descriptions
-
-$${\bf Z}{^Z{\bf T}_6}{^{T_6}{\bf E}}
-   = {\bf B}{^B{\bf G}}\eqno(1.130)$$
-
-If we wish to solve Equation 1.130 for the manipulator transform 
-${\bf T}_6$ we must premultiply Equation 1.130 by ${\bf Z}^{-1}$ and
-postmultiply by ${\bf E}^{-1}$ to obtain
-
-$${\bf T}_6 
- = {{\bf Z}^{-1}} {\bf B} {\bf G} {{\bf E}^{-1}}\eqno(1.131)$$
-
-\noindent
-As a further example, consider that the position of the object {\bf B}
-is unknown, but that the manipulator is moved such that the end
-effector is positioned over the object correctly. We may then solve
-for {\bf B} from Equation 1.130 by postmultiplying by ${\bf G}^{-1}$.
-
-$${\bf B} = {\bf Z}{{\bf T}_6}{\bf E}{{\bf G}^{-1}}\eqno(1.133)$$
-
-\section{Summary}
-
-\noindent
-Homogeneous transformations may be readily used to describe the
-positions and orientations of coordinate frames in space. If a
-coordinate frame is embedded in an object then the position and
-orientation of the object are also readily described.
-
-The description of object A in terms of object B by means of a
-homogeneous transformation may be inverted to obtain the description
-of object B in terms of object A. This is not a property of a simple
-vector description of the relative displacement of one object with
-respect to another.
-
-Transformations may be interpreted as a product of rotation and
-translation transformations. If they are intrepreted from left to
-right, then the rotations and translations are in terms of the
-currently defined coordinate frame. If they are interpreted from right
-to left, then the rotations and translations are described with
-respect to the reference coordinate frame.
-
-Homogeneous transformations describe coordinate frames in terms of
-rectangular components, which are the sines and cosines of
-angles. This description may be related to rotations in which case the
-description is in terms of a vector and angle of rotation.
-
-\section{Denavit-Hartenberg Matrices}
-<<domain DHMATRIX DenavitHartenbergMatrix>>=
---Copyright The Numerical Algorithms Group Limited 1991.
-
-++ 4x4 Matrices for coordinate transformations
-++ Author: Timothy Daly
-++ Date Created: June 26, 1991
-++ Date Last Updated: 26 June 1991
-++ Description:
-++   This package contains functions to create 4x4 matrices
-++   useful for rotating and transforming coordinate systems.
-++   These matrices are useful for graphics and robotics.
-++   (Reference: Robot Manipulators Richard Paul MIT Press 1981) 
- 
- 
-)abbrev domain DHMATRIX DenavitHartenbergMatrix
- 
---% DHMatrix
-
-DenavitHartenbergMatrix(R): Exports == Implementation where
-  ++ A Denavit-Hartenberg Matrix is a 4x4 Matrix of the form:
-  ++  \spad{nx ox ax px}
-  ++  \spad{ny oy ay py}
-  ++  \spad{nz oz az pz}
-  ++   \spad{0  0  0  1}
-  ++ (n, o, and a are the direction cosines)
-  R : Join(Field,  TranscendentalFunctionCategory)
-
--- for the implementation of dhmatrix
-  minrow ==> 1
-  mincolumn ==> 1
---
-  nx ==> x(1,1)::R
-  ny ==> x(2,1)::R
-  nz ==> x(3,1)::R
-  ox ==> x(1,2)::R
-  oy ==> x(2,2)::R
-  oz ==> x(3,2)::R
-  ax ==> x(1,3)::R
-  ay ==> x(2,3)::R
-  az ==> x(3,3)::R
-  px ==> x(1,4)::R
-  py ==> x(2,4)::R
-  pz ==> x(3,4)::R
-  row ==> Vector(R)
-  col ==> Vector(R)
-  radians ==> pi()/180
-
-  Exports ==> MatrixCategory(R,row,col) with
-   "*": (%, Point R) -> Point R
-     ++ t*p applies the dhmatrix t to point p
-   identity: () -> %
-     ++ identity() create the identity dhmatrix
-   rotatex: R -> %
-     ++ rotatex(r) returns a dhmatrix for rotation about axis X for r degrees
-   rotatey: R -> %
-     ++ rotatey(r) returns a dhmatrix for rotation about axis Y for r degrees
-   rotatez: R -> %
-     ++ rotatez(r) returns a dhmatrix for rotation about axis Z for r degrees
-   scale: (R,R,R) -> %
-     ++ scale(sx,sy,sz) returns a dhmatrix for scaling in the X, Y and Z
-     ++ directions
-   translate: (R,R,R) -> %
-     ++ translate(X,Y,Z) returns a dhmatrix for translation by X, Y, and Z
- 
-  Implementation ==> Matrix(R) add
-
-    identity() == matrix([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])
-
---    inverse(x) == (inverse(x pretend (Matrix R))$Matrix(R)) pretend %
---    dhinverse(x) == matrix( _
---        [[nx,ny,nz,-(px*nx+py*ny+pz*nz)],_
---         [ox,oy,oz,-(px*ox+py*oy+pz*oz)],_
---         [ax,ay,az,-(px*ax+py*ay+pz*az)],_
---         [ 0, 0, 0, 1]])
-
-    d * p ==
-       v := p pretend Vector R
-       v := concat(v, 1$R)
-       v := d * v
-       point ([v.1, v.2, v.3]$List(R))
-
-<<rotatex>>
-
-<<rotatey>>
-
-<<rotatez>>
-
-<<scale>>
-
-<<translate>>
- 
-@
-\section{License}
-<<license>>=
---Portions Copyright (c) Richard Paul
---Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
---All rights reserved.
---
---Redistribution and use in source and binary forms, with or without
---modification, are permitted provided that the following conditions are
---met:
---
---    - Redistributions of source code must retain the above copyright
---      notice, this list of conditions and the following disclaimer.
---
---    - Redistributions in binary form must reproduce the above copyright
---      notice, this list of conditions and the following disclaimer in
---      the documentation and/or other materials provided with the
---      distribution.
---
---    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
---      names of its contributors may be used to endorse or promote products
---      derived from this software without specific prior written permission.
---
---THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
---IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
---TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
---PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
---OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
---EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
---PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
---PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
---LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
---NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
---SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-@
-<<*>>=
-<<license>>
-
-<<domain DHMATRIX DenavitHartenbergMatrix>>
-@ 
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} Paul, Richard,
-{\sl Robot Manipulators},
-MIT Press, Cambridge, Mass.,
-(1981)
-\end{thebibliography}
-\end{document}
diff --git a/src/input/Makefile.pamphlet b/src/input/Makefile.pamphlet
index 81a53b2..071d86e 100644
--- a/src/input/Makefile.pamphlet
+++ b/src/input/Makefile.pamphlet
@@ -291,8 +291,8 @@ REGRES= algaggr.regress algbrbf.regress  algfacob.regress alist.regress  \
     cycles1.regress   cycles.regress   cyfactor.regress \
     danzwill.regress  danzwill2.regress  \
     decimal.regress   defintef.regress defintrf.regress \
-    derham.regress    dfloat.regress   dhtri.regress directproduct.regress \
-    divisor.regress \
+    derham.regress    dfloat.regress   dhmatrix.regress \
+    dhtri.regress     directproduct.regress divisor.regress \
     dmp.regress       dpol.regress     e1.regress       ei.regress \
     easter.regress    efi.regress \
     eigen.regress     elemfun.regress  elemnum.regress  elfuts.regress \
@@ -544,7 +544,8 @@ FILES= ${OUT}/algaggr.input  ${OUT}/algbrbf.input    ${OUT}/algfacob.input \
        ${OUT}/decimal.input    ${OUT}/defs.input \
        ${OUT}/defintef.input ${OUT}/defintrf.input   ${OUT}/derham.input \
        ${OUT}/de2re.input \
-       ${OUT}/dfloat.input   ${OUT}/dhtri.input  ${OUT}/directproduct.input \
+       ${OUT}/dfloat.input   ${OUT}/dhmatrix.input \
+       ${OUT}/dhtri.input  ${OUT}/directproduct.input \
        ${OUT}/divisor.input \
        ${OUT}/dmp.input      ${OUT}/dpol.input       ${OUT}/draw2dsf.input \
        ${OUT}/drawalg.input  ${OUT}/drawcfn.input \
@@ -779,7 +780,8 @@ DOCFILES= \
   ${DOC}/de2re.input.dvi       ${DOC}/decimal.input.dvi    \
   ${DOC}/defintef.input.dvi    ${DOC}/defintrf.input.dvi   \
   ${DOC}/defs.input.dvi        ${DOC}/derham.input.dvi     \
-  ${DOC}/dfloat.input.dvi      ${DOC}/dhtri.input.dvi      \
+  ${DOC}/dfloat.input.dvi      ${DOC}/dhmatrix.input.dvi \
+  ${DOC}/dhtri.input.dvi      \
   ${DOC}/directproduct.input.dvi \
   ${DOC}/divisor.input.dvi     ${DOC}/dmp.input.dvi        \
   ${DOC}/dpol.input.dvi        \
diff --git a/src/input/dhmatrix.input.pamphlet b/src/input/dhmatrix.input.pamphlet
new file mode 100644
index 0000000..2725a36
--- /dev/null
+++ b/src/input/dhmatrix.input.pamphlet
@@ -0,0 +1,260 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/input dhmatrix.input}
+\author{Timothy Daly}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+<<*>>=
+)spool dhmatrix.output
+)set message test on
+)set message auto off
+)clear all
+ 
+@
+We create a target domain
+<<*>>=
+--S 1 of 16
+t1:=DHMATRIX(DoubleFloat)
+--R
+--R   (1)  DenavitHartenbergMatrix DoubleFloat
+--R                                                                 Type: Domain
+--E 1
+
+@
+This creates an identity element from the target domain.
+<<*>>=
+--S 2 of 16
+t2:=identity()$t1
+--R
+--R        +1.  0.  0.  0.+
+--R        |              |
+--R        |0.  1.  0.  0.|
+--R   (2)  |              |
+--R        |0.  0.  1.  0.|
+--R        |              |
+--R        +0.  0.  0.  1.+
+--R                                    Type: DenavitHartenbergMatrix DoubleFloat
+--E 2
+
+@
+This is the rotation matrix around the X axis for 30 degrees
+<<*>>=
+--S 3 of 16
+t3:=rotatex(30)
+--R
+--R        +1   0     0    0+
+--R        |                |
+--R        |    +-+         |
+--R        |   \|3     1    |
+--R        |0  ----  - -   0|
+--R        |     2     2    |
+--R   (3)  |                |
+--R        |          +-+   |
+--R        |    1    \|3    |
+--R        |0   -    ----  0|
+--R        |    2      2    |
+--R        |                |
+--R        +0   0     0    1+
+--R                             Type: DenavitHartenbergMatrix Expression Integer
+--E 3
+
+@
+This is the rotation matrix around the Y axis for 30 degrees
+<<*>>=
+--S 4 of 16
+t4:=rotatey(30)
+--R
+--R        + +-+            +
+--R        |\|3       1     |
+--R        |----  0   -    0|
+--R        |  2       2     |
+--R        |                |
+--R        | 0    1   0    0|
+--R   (4)  |                |
+--R        |          +-+   |
+--R        |  1      \|3    |
+--R        |- -   0  ----  0|
+--R        |  2        2    |
+--R        |                |
+--R        + 0    0   0    1+
+--R                             Type: DenavitHartenbergMatrix Expression Integer
+--E 4
+
+@
+This is the rotation matrix around the Z axis for 30 degrees
+<<*>>=
+--S 5 of 16
+t5:=rotatez(30)
+--R
+--R        + +-+            +
+--R        |\|3     1       |
+--R        |----  - -   0  0|
+--R        |  2     2       |
+--R        |                |
+--R        |       +-+      |
+--R   (5)  | 1    \|3       |
+--R        | -    ----  0  0|
+--R        | 2      2       |
+--R        |                |
+--R        | 0     0    1  0|
+--R        |                |
+--R        + 0     0    0  1+
+--R                             Type: DenavitHartenbergMatrix Expression Integer
+--E 5
+
+@
+This scales along X, Y, and Z by 1/2
+<<*>>=
+--S 6 of 16
+t6:=scale(0.5,0.5,0.5)
+--R
+--R        +0.5  0.0  0.0  0.0+
+--R        |                  |
+--R        |0.0  0.5  0.0  0.0|
+--R   (6)  |                  |
+--R        |0.0  0.0  0.5  0.0|
+--R        |                  |
+--R        +0.0  0.0  0.0  1.0+
+--R                                          Type: DenavitHartenbergMatrix Float
+--E 6
+
+@
+This translates along the X, Y, and Z axis by 2 units
+<<*>>=
+--S 7 of 16
+t7:=translate(2.0,2.0,2.0)
+--R
+--R        +1.0  0.0  0.0  2.0+
+--R        |                  |
+--R        |0.0  1.0  0.0  2.0|
+--R   (7)  |                  |
+--R        |0.0  0.0  1.0  2.0|
+--R        |                  |
+--R        +0.0  0.0  0.0  1.0+
+--R                                          Type: DenavitHartenbergMatrix Float
+--E 7
+
+@
+This is a point on the X axis  can move around the plane
+<<*>>=
+--S 8 of 16
+t8:Point(DoubleFloat):=[4.0,0.0,0.0]$List(DoubleFloat)
+--R
+--R   (8)  [4.,0.,0.]
+--R                                                      Type: Point DoubleFloat
+--E 8
+
+@
+First, we construct a translation along the X axis by 3 units
+<<*>>=
+--S 9 of 16
+t9:=translate(4.0,0.0,0.0)
+--R
+--R        +1.0  0.0  0.0  4.0+
+--R        |                  |
+--R        |0.0  1.0  0.0  0.0|
+--R   (9)  |                  |
+--R        |0.0  0.0  1.0  0.0|
+--R        |                  |
+--R        +0.0  0.0  0.0  1.0+
+--R                                          Type: DenavitHartenbergMatrix Float
+--E 9
+
+@
+and we apply the transformation so t8 is now moved
+<<*>>=
+--S 10 of 16
+t10:=t9*t8
+--R
+--R   (10)  [8.,0.,0.]
+--R                                                      Type: Point DoubleFloat
+--E 10
+
+@
+Now we rotate the point 90 degrees around the Z axis
+which will move the point from the X axis to the Y axis.
+<<*>>=
+--S 11 of 16
+t11:=rotatez(90)*t10
+--R
+--R   (11)  [0.,8.,0.]
+--R                                           Type: Point Expression DoubleFloat
+--E 11
+
+@
+and we can scale the point by 1/2 to shorten along the Y axis
+<<*>>=
+--S 12 of 16
+t12:=scale(0.0,0.5,0.0)*t11
+--R
+--R   (12)  [0.,4.,0.]
+--R                                           Type: Point Expression DoubleFloat
+--E 12
+
+@
+Now we rotate the point 90 degrees around the X axis
+which will move the point from the Y axis to the Z axis.
+<<*>>=
+--S 13 of 16
+t13:=rotatex(90)*t12
+--R
+--R   (13)  [0.,0.,4.]
+--R                                           Type: Point Expression DoubleFloat
+--E 13
+
+@
+Now we rotate the point 90 degrees around the Y axis
+which will move the point from the Z axis to the X axis.
+We are now back to the original point
+<<*>>=
+--S 14 of 16
+t14:=rotatey(90)*t13
+--R
+--R   (14)  [4.,0.,0.]
+--R                                           Type: Point Expression DoubleFloat
+--E 14
+
+@
+We can do all of the translations, rotations, and scaling and
+create a single matrix that will apply them all at once.
+<<*>>=
+--S 15 of 16
+t15:=rotatey(90)*rotatex(90)*scale(0.0,0.5,0.0)*_
+     rotatez(90)*translate(4.0,0.0,0.0)
+--R
+--R         +0.5  0.0  0.0  2.0+
+--R         |                  |
+--R         |0.0  0.0  0.0  0.0|
+--R   (15)  |                  |
+--R         |0.0  0.0  0.0  0.0|
+--R         |                  |
+--R         +0.0  0.0  0.0  1.0+
+--R                               Type: DenavitHartenbergMatrix Expression Float
+--E 15
+
+@
+We can do all of the translations, rotations, and scaling and
+create a single matrix that will apply them all at once. The
+original point is moved around the space back to its original point.
+<<*>>=
+--S 16 of 16
+t16:=t15*t8
+--R
+--R   (16)  [4.,0.,0.]
+--R                                           Type: Point Expression DoubleFloat
+--E 16
+
+)spool 
+)lisp (bye)
+ 
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}
