# Affine transforms - matrix algebra

Pavel Safrata pavel.safrata at oracle.com
Mon Jul 16 04:26:30 PDT 2012

```One more idea: we should probably add type MAT_3x3 and accept arrays of
length 9 (for 2D transforms only, with the last row always 0, 0, 1).
Pavel

On 16.7.2012 13:00, Pavel Safrata wrote:
> Thanks guys for all the suggestions. Here is the updated complete
> proposal.
>
> On Transform class:
>     public Transform createConcatenation(Transform transform)
>         // Creates new concatenated transform that is equivalent to
>         // this transform applied first and the given transform second
>         // Means multiplication on the left by the given transform
>     public Transform createInverse() throws
> NoninvertibleTransformException
>         // Creates a negated transform
>     public double get(int col, int row)
>         // Convenience getter for the individual elements
>         // Accepts both params in range 0..3, throws IllegalArgument
> otherwise
>     public double[] toArray(MatrixArrayType type)
>         // Transform.MatrixArrayType is an enum { MAT_2x3, MAT_3x4,
> MAT_4x4 }
>         // Returns array of length 6, 12, 16, respectively
>         // Throws IllegalArgument if 2x3 is requested for a 3D transform
>     public double[] toArray(MatrixArrayType type, double[] array)
>         // Similar to the above, just uses the passed array if it is
> big enough
>     public Transform clone()
>         // Of course Transform implementing Cloneable
>
>     // in subclasses the methods returning Transform will be
> overridden and
>     // will return more specific types where possible.
>
> On Affine class:
>
> Constructors:
>     public Affine(Transform transform)
>     public Affine(double mxx, double mxy, double tx,
>                   double myx, double myy, double ty)
>     public Affine(double mxx, double mxy, double mxz, double tx,
>                   double myx, double myy, double myz, double ty,
>                   double mzx, double mzy, double mzz, double tz)
>     public Affine(double[] matrix)
>         // accepts arrays of length 6, 12 and 16.
>         // In case of 16 members the last four numbers must be 0, 0, 0, 1
>         // throws IllegalArgument if the above conditions are not met
>
> Setters of the entire matrix:
>     public void setToTransform(Transform t)
>     public void setToTransform(double mxx, double mxy, double tx,
>                                double myx, double myy, double ty)
>     public void setToTransform(double mxx, double mxy, double mxz,
> double mxt,
>                                double myx, double myy, double myz,
> double myt,
>                                double mzx, double mzy, double mzz,
> double mzt)
>     public void setToTransform(double[] matrix)
>         // the same acceptance criteria as the constructor
>     public void setToIdentity()
>
> Operations on the matrix (modifying it in place):
>     public void invert() throws NoninvertibleTransformException
>     public void append(Transform t)
>     public void append(double mxx, double mxy, double tx,
>                        double myx, double myy, double ty)
>     public void append(double Txx, double Txy, double Txz, double Txt,
>                        double Tyx, double Tyy, double Tyz, double Tyt,
>                        double Tzx, double Tzy, double Tzz, double Tzt)
>     public void append(double[] matrix)
>
>     public void appendTranslation(double tx, double ty)
>     public void appendTranslation(double tx, double ty, double tz)
>     public void appendScale(double sx, double sy)
>     public void appendScale(double sx, double sy, double pivotX,
> double pivotY)
>     public void appendScale(double sx, double sy, double sz)
>     public void appendScale(double sx, double sy, double sz,
>                             double pivotX, double pivotY, double pivotZ)
>     public void appendRotation(double theta)
>     public void appendRotation(double theta, double pivotX, double
> pivotY)
>     public void appendRotation(double theta,
>                                double axisX, double axisY, double axisZ,
>                                double pivotX, double pivotY, double
> pivotZ)
>     public void appendShear(double shx, double shy)
>     public void appendShear(double shx, double shy, double pivotX,
> double pivotY)
>
>     // "append" means "add the transformation after the existing one", so
>     // "append" means multiply this matrix on the left by the given
> matrix
>
>     public void prepend* // 15 methods
>         // Every append* method has its prepend* companion,
>         // adding the transformation before the existing one,
>         // multiplying on the right
>
>
> Other methods:
>     public void set(int row, int col, double value)
>         // convenience setter for the individual elements
>         // accepts row and col in range 0..3
>         // allows to set the last row only to 0, 0, 0, 1
>         // throws IllegalArgument if the above conditions are not met
>
>     public double getDeterminant()
>
> Regards,
> Pavel
>
>

```