Affine transforms - matrix algebra
Pavel Safrata
pavel.safrata at oracle.com
Thu Jul 12 08:14:07 PDT 2012
Sounds good. We already proposed 2D variants for all the methods using
directly the simple transformations so this goes along with the
proposal. It means:
public Affine(double mxx, double mxy, double tx,
double myx, double myy, double ty)
Methods setToTransform, append and prepend with the same arguments.
Thanks,
Pavel
On 12.7.2012 16:40, Dr. Michael Paus wrote:
> I am not sure whether this has already been discussed but would it be
> possible
> to have a special variant of all constructors and methods, which
> currently take
> the full set of matrix elements, which only deal with the 2D subset of
> matrix
> elements? This would reduce the number of parameters that you have to
> specify in most cases. It would also prevent an issue which I had some
> time
> ago where I specified all elements of a matrix explicitly and when I used
> that matrix I lost all anti-aliasing. Don't know if this is still an
> issue and what
> the exact circumstances were.
>
> Michael
>
> Am 10.07.2012 17:00, schrieb Pavel Safrata:
>> Hello,
>> based on previous discussions, we're going to propose a set of new
>> methods to our transforms.
>>
>> Tracking Jira issue: http://javafx-jira.kenai.com/browse/RT-17942
>>
>> I hope the names are self-explanatory, otherwise please let me know
>> and I'll provide some description.
>>
>>
>> On Transform class:
>> public Transform getConcatenation(Transform transform) //
>> multiplication
>> public Transform getInverse() throws
>> NoninvertibleTransformException // negation
>> public Transform copy()
>>
>> Note: in subclasses these methods 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 mxz, double tx,
>> double myx, double myy, double myz, double ty,
>> double mzx, double mzy, double mzz, double tz)
>>
>> Setters of the entire matrix:
>> public void setToTransform(Transform t)
>> 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 setToIdentity()
>> public void setToTranslation(double tx, double ty)
>> public void setToTranslation(double tx, double ty, double tz)
>> public void setToScale(double sx, double sy)
>> public void setToScale(double sx, double sy, double pivotX,
>> double pivotY)
>> public void setToScale(double sx, double sy, double sz)
>> public void setToScale(double sx, double sy, double sz,
>> double pivotX, double pivotY, double pivotZ)
>> public void setToRotation(double theta)
>> public void setToRotation(double theta, double pivotX, double
>> pivotY)
>> public void setToRotation(double theta,
>> double axisX, double axisY, double axisZ,
>> double pivotX, double pivotY, double
>> pivotZ)
>> public void setToShear(double shx, double shy)
>> public void setToShear(double shx, double shy, double pivotX,
>> double pivotY)
>>
>> Operations on the matrix (modifying it in place):
>> public void invert() throws NoninvertibleTransformException
>> public void concatenate(Transform t)
>> public void concatenate(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 preConcatenate(Transform t) // left multiplication
>> public void preConcatenate(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 concatWithTranslation(double tx, double ty)
>> public void concatWithTranslation(double tx, double ty, double tz)
>> public void concatWithScale(double sx, double sy)
>> public void concatWithScale(double sx, double sy, double pivotX,
>> double pivotY)
>> public void concatWithScale(double sx, double sy, double sz)
>> public void concatWithScale(double sx, double sy, double sz,
>> double pivotX, double pivotY, double
>> pivotZ)
>> public void concatWithRotation(double theta)
>> public void concatWithRotation(double theta, double pivotX,
>> double pivotY)
>> public void concatWithRotation(double theta,
>> double axisX, double axisY, double axisZ,
>> double pivotX, double pivotY, double
>> pivotZ)
>> public void concatWithShear(double shx, double shy)
>> public void concatWithShear(double shx, double shy, double
>> pivotX, double pivotY)
>> public void preTranslate(double mxt, double myt)
>> public void preTranslate(double mxt, double myt, double mzt)
>>
>> Other methods:
>> public double getDeterminant()
>>
>>
>> Notes:
>>
>> Instead of "concatWithTranslation" it would be more natural to use
>> just "translate" (and similarly for the others), but unfortunately
>> these method names are already taken by the static factory methods on
>> Transform class. This is unpleasant but we need to be backward
>> compatible so we have to introduce different names. We'll be happy to
>> hear better naming suggestions than the concatWith* (which is pretty
>> descriptive I think but not really nice).
>>
>> To avoid even bigger method explosion this proposal doesn't contain
>> all the convenience "preConcatWith*" methods. However, we added
>> preTranslate, because it is needed quite often (and
>> preConcatWithTranslation looks quite horrible). Any comments to that?
>>
>> Should rotation axis be passed as Point3D (rather than the three
>> doubles), consistently with Rotate transform?
>>
>> Would you want static factory methods on Affine (creating Affine
>> instances with the simple transforms)?
>>
>> Would it be important to you whether or not matrix changes are
>> atomic? If you call one of the methods that modify the entire matrix,
>> can be listeners for each member called immediately as the members
>> are set, or do they need to be called after all the members are updated?
>>
>> Any missing operations?
>>
>> Thanks,
>> Pavel
>
>
>
More information about the openjfx-dev
mailing list