Affine transforms - matrix algebra

Pavel Safrata pavel.safrata at oracle.com
Mon Jul 16 04:00:41 PDT 2012


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




More information about the openjfx-dev mailing list