JDK-8100722 : Provide Affine class with matrix manipulation methods (multiply, premultipy, negate, etc.)
  • Type: Enhancement
  • Component: javafx
  • Sub-Component: scenegraph
  • Affected Version: fx2.0.3
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • Submitted: 2011-11-14
  • Updated: 2015-06-16
  • Resolved: 2012-09-10
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8
8Fixed
Related Reports
Blocks :  
Relates :  
Relates :  
Relates :  
Description
Affine class lacks many useful methods such as multiply, premultiply and similar. JavaFX developer has to implement his own operations on Affine matrices or use 3rd party library while internally used Affine3D has all the necessary operations.
Comments
Verified with javafx-sdk8.0.0-ea-b58
03-10-2012

Unit Tests: javafx/geometry/Point2DTest/testAdd javafx/geometry/Point2DTest/testAddNull javafx/geometry/Point2DTest/testSubtract javafx/geometry/Point2DTest/testSubtractNull javafx/geometry/Point2DTest/testNormalize javafx/geometry/Point2DTest/testMidpoint javafx/geometry/Point2DTest/testMidpointNull javafx/geometry/Point2DTest/testVectorAngle javafx/geometry/Point2DTest/testVectorAngleNull javafx/geometry/Point2DTest/testPointAngle javafx/geometry/Point2DTest/testPointAngle1Null javafx/geometry/Point2DTest/testPointAngle2Null javafx/geometry/Point2DTest/testMagnitude javafx/geometry/Point2DTest/testDotProduct javafx/geometry/Point2DTest/testDotProductNull javafx/geometry/Point2DTest/testCrossProduct javafx/geometry/Point2DTest/testCrossProductNull javafx/geometry/Point3DTest/testAdd javafx/geometry/Point3DTest/testAddNull javafx/geometry/Point3DTest/testSubtract javafx/geometry/Point3DTest/testSubtractNull javafx/geometry/Point3DTest/testNormalize javafx/geometry/Point3DTest/testMidpoint javafx/geometry/Point3DTest/testMidpointNull javafx/geometry/Point3DTest/testVectorAngle javafx/geometry/Point3DTest/testVectorAngleNull javafx/geometry/Point3DTest/testPointAngle javafx/geometry/Point3DTest/testPointAngle1Null javafx/geometry/Point3DTest/testPointAngle2Null javafx/geometry/Point3DTest/testMagnitude javafx/geometry/Point3DTest/testDotProduct javafx/geometry/Point3DTest/testDotProductNull javafx/geometry/Point3DTest/testCrossProduct javafx/geometry/Point3DTest/testCrossProductNull javafx/scene/transform/TransformTest/eachCornerShouldBeConsideredBySimilarTo3D javafx/scene/transform/TransformTest/eachCornerShouldBeConsideredBySimilarTo2D javafx/scene/transform/TransformChangedEventTest/testDefaultConstructor javafx/scene/transform/TransformChangedEventTest/testConstructor javafx/scene/transform/MatrixTypeTest/testIs2D javafx/scene/transform/MatrixTypeTest/testRows javafx/scene/transform/MatrixTypeTest/testColumns javafx/scene/transform/MatrixTypeTest/testElements javafx/scene/transform/AffineTest/testTransformConstructor javafx/scene/transform/AffineTest/testTransformConstructorNull javafx/scene/transform/AffineTest/test2DConstructor javafx/scene/transform/AffineTest/test3DConstructor javafx/scene/transform/AffineTest/testArrayConstructor javafx/scene/transform/AffineTest/testArrayConstructorNullType javafx/scene/transform/AffineTest/testArrayConstructorNullMatrix javafx/scene/transform/AffineTest/testArrayConstructor2x3ShortArray javafx/scene/transform/AffineTest/testArrayConstructor3x3ShortArray javafx/scene/transform/AffineTest/testArrayConstructor3x4ShortArray javafx/scene/transform/AffineTest/testArrayConstructor4x4ShortArray javafx/scene/transform/AffineTest/testArrayConstructor3x3NotAffineX javafx/scene/transform/AffineTest/testArrayConstructor3x3NotAffineY javafx/scene/transform/AffineTest/testArrayConstructor3x3NotAffineT javafx/scene/transform/AffineTest/testArrayConstructor4x4NotAffineX javafx/scene/transform/AffineTest/testArrayConstructor4x4NotAffineY javafx/scene/transform/AffineTest/testArrayConstructor4x4NotAffineZ javafx/scene/transform/AffineTest/testArrayConstructor4x4NotAffineT javafx/scene/transform/AffineTest/testTransformSetToTransform javafx/scene/transform/AffineTest/testTransformSetToTransformNull javafx/scene/transform/AffineTest/test2DSetToTransform javafx/scene/transform/AffineTest/test3DSetToTransform javafx/scene/transform/AffineTest/testArraySetToTransform javafx/scene/transform/AffineTest/testArraySetToTransformNullMatrix javafx/scene/transform/AffineTest/testArraySetToTransformNullType javafx/scene/transform/AffineTest/testArraySetToTransform2x3ShortArray javafx/scene/transform/AffineTest/testArraySetToTransform3x3ShortArray javafx/scene/transform/AffineTest/testArraySetToTransform3x4ShortArray javafx/scene/transform/AffineTest/testArraySetToTransform4x4ShortArray javafx/scene/transform/AffineTest/testArraySetToTransform3x3NotAffineX javafx/scene/transform/AffineTest/testArraySetToTransform3x3NotAffineY javafx/scene/transform/AffineTest/testArraySetToTransform3x3NotAffineT javafx/scene/transform/AffineTest/testArraySetToTransform4x4NotAffineX javafx/scene/transform/AffineTest/testArraySetToTransform4x4NotAffineY javafx/scene/transform/AffineTest/testArraySetToTransform4x4NotAffineZ javafx/scene/transform/AffineTest/testArraySetToTransform4x4NotAffineT javafx/scene/transform/AffineTest/everybodyShouldBeNotifiedAfterAtomicChange javafx/scene/transform/AffineTest/atomicChangeShouldnotifyOnlyChangedMembers javafx/scene/transform/AffineTest/testRepeatedAtomicChangeNotifications javafx/scene/transform/AffineTest/atomicChangeBackAndForthShouldNotNotify javafx/scene/transform/AffineTest/recursiveAtomicChangeShouldBeFine javafx/scene/transform/AffineOperationsTest/SetToTransformShouldBeAtomic javafx/scene/transform/AffineOperationsTest/SetToTransform2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testSetToIdentity javafx/scene/transform/AffineOperationsTest/SetToIdentityShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendTranslation2D javafx/scene/transform/AffineOperationsTest/testAppendZeroTranslation2D javafx/scene/transform/AffineOperationsTest/testAppendTranslation2DWhichEliminatesTranslation javafx/scene/transform/AffineOperationsTest/testAppendTranslation3DWhichMakesTranslation2D javafx/scene/transform/AffineOperationsTest/appendTranslation2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependTranslation2D javafx/scene/transform/AffineOperationsTest/testPrependZeroTranslation javafx/scene/transform/AffineOperationsTest/prependTranslation2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendTranslation3D javafx/scene/transform/AffineOperationsTest/appendTranslation3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependTranslation3D javafx/scene/transform/AffineOperationsTest/testPrependTranslation3DWhichMakesIt2D javafx/scene/transform/AffineOperationsTest/prependTranslation3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendScale2D javafx/scene/transform/AffineOperationsTest/testAppendNullPivotScale2D javafx/scene/transform/AffineOperationsTest/testAppendZeroPivotScale2D javafx/scene/transform/AffineOperationsTest/testAppendZeroScale2D javafx/scene/transform/AffineOperationsTest/testAppendNoScale2D javafx/scene/transform/AffineOperationsTest/testAppendScale2DWhichMayEliminateScale javafx/scene/transform/AffineOperationsTest/testAppendScale3DWhichMakesIt2D javafx/scene/transform/AffineOperationsTest/appendScale2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependScale2D javafx/scene/transform/AffineOperationsTest/testPrependNullPivotedScale2D javafx/scene/transform/AffineOperationsTest/testPrependZeroPivotScale2D javafx/scene/transform/AffineOperationsTest/testPrependZeroScale2D javafx/scene/transform/AffineOperationsTest/testPrependHalfZeroScale2D javafx/scene/transform/AffineOperationsTest/testPrependOtherHalfZeroScale2D javafx/scene/transform/AffineOperationsTest/testPrependNoScale2D javafx/scene/transform/AffineOperationsTest/testPrependOppositeScale2D javafx/scene/transform/AffineOperationsTest/testPrependOppositeScale3D javafx/scene/transform/AffineOperationsTest/prependScale2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendPivotedScale2D javafx/scene/transform/AffineOperationsTest/testAppendPointPivotedScale2D javafx/scene/transform/AffineOperationsTest/appendPivotedScale2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependPivotedScale2D javafx/scene/transform/AffineOperationsTest/testPrependPointPivotedScale2D javafx/scene/transform/AffineOperationsTest/prependPivotedScale2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendScale3D javafx/scene/transform/AffineOperationsTest/testAppendNullPivotedScale3D javafx/scene/transform/AffineOperationsTest/testAppendOppositeScale2D javafx/scene/transform/AffineOperationsTest/testAppendOppositeScale3D javafx/scene/transform/AffineOperationsTest/appendScale3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependScale3D javafx/scene/transform/AffineOperationsTest/testPrependNullPivotedScale3D javafx/scene/transform/AffineOperationsTest/testPrependScale3DWichMakesIt2D javafx/scene/transform/AffineOperationsTest/prependScale3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendPivotedScale3D javafx/scene/transform/AffineOperationsTest/testAppendPointPivotedScale3D javafx/scene/transform/AffineOperationsTest/appendPivotedScale3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependPivotedScale3D javafx/scene/transform/AffineOperationsTest/testPrependPointPivotedScale3D javafx/scene/transform/AffineOperationsTest/prependPivotedScale3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendShear2D javafx/scene/transform/AffineOperationsTest/testAppendNullPivotedShear2D javafx/scene/transform/AffineOperationsTest/testPrependNullPivotedShear2D javafx/scene/transform/AffineOperationsTest/testAppendZeroPivotedShear2D javafx/scene/transform/AffineOperationsTest/testPrependZeroPivotedShear2D javafx/scene/transform/AffineOperationsTest/testAppendZeroShear2D javafx/scene/transform/AffineOperationsTest/appendShear2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependShear2D javafx/scene/transform/AffineOperationsTest/testPrependShearWhichMayEliminateTranslation javafx/scene/transform/AffineOperationsTest/testPrependZeroShear2D javafx/scene/transform/AffineOperationsTest/prependShear2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendPivotedShear2D javafx/scene/transform/AffineOperationsTest/testAppendPointPivotedShear2D javafx/scene/transform/AffineOperationsTest/appendPivotedShear2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependPivotedShear2D javafx/scene/transform/AffineOperationsTest/testPrependPointPivotedShear2D javafx/scene/transform/AffineOperationsTest/prependPivotedShear2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendRotation2D javafx/scene/transform/AffineOperationsTest/appendRotate2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependRotation2D javafx/scene/transform/AffineOperationsTest/prependRotate2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendRotation90 javafx/scene/transform/AffineOperationsTest/appendRotate90ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependRotation90 javafx/scene/transform/AffineOperationsTest/prependRotate90ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendRotation180 javafx/scene/transform/AffineOperationsTest/appendRotate180ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependRotation180 javafx/scene/transform/AffineOperationsTest/prependRotate180ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendRotation270 javafx/scene/transform/AffineOperationsTest/appendRotate270ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependRotation270 javafx/scene/transform/AffineOperationsTest/prependRotate270ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendRotationMinus450 javafx/scene/transform/AffineOperationsTest/testPrependRotationMinus450 javafx/scene/transform/AffineOperationsTest/testAppendPivotedRotate2D javafx/scene/transform/AffineOperationsTest/testAppendNullPivotedRotate2D javafx/scene/transform/AffineOperationsTest/testPrependNullPivotedRotate2D javafx/scene/transform/AffineOperationsTest/testAppendZeroPivotedRotate2D javafx/scene/transform/AffineOperationsTest/testAppendPointPivotedRotate2D javafx/scene/transform/AffineOperationsTest/appendPivotedRotate2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependPivotedRotate2D javafx/scene/transform/AffineOperationsTest/testPrependZeroPivotedRotate2D javafx/scene/transform/AffineOperationsTest/testPrependPointPivotedRotate2D javafx/scene/transform/AffineOperationsTest/prependPivotedRotate2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendNoRotation javafx/scene/transform/AffineOperationsTest/testAppendRotation3D javafx/scene/transform/AffineOperationsTest/testAppendNullAxisRotation3D javafx/scene/transform/AffineOperationsTest/testPrependNullAxisRotation3D javafx/scene/transform/AffineOperationsTest/testAppendNullAxisPointPivotRotation3D javafx/scene/transform/AffineOperationsTest/testPrependNullAxisPointPivotRotation3D javafx/scene/transform/AffineOperationsTest/testAppendNullPivotRotation3D javafx/scene/transform/AffineOperationsTest/testPrependNullPivotRotation3D javafx/scene/transform/AffineOperationsTest/testAppendRotation3Dbeing2D javafx/scene/transform/AffineOperationsTest/testAppendRotation3DbeingUpsideDown2D javafx/scene/transform/AffineOperationsTest/testAppendRotationWithZeroAxis javafx/scene/transform/AffineOperationsTest/testAppendRotationWithAlmostZeroAxis javafx/scene/transform/AffineOperationsTest/testAppendPointedAxisRotation3D javafx/scene/transform/AffineOperationsTest/testAppendPointedAxisPointedPivotRotation3D javafx/scene/transform/AffineOperationsTest/appendRotate3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependRotation3D javafx/scene/transform/AffineOperationsTest/testPrependNoRotation javafx/scene/transform/AffineOperationsTest/testPrependRotation3Dbeing2D javafx/scene/transform/AffineOperationsTest/testPrependRotation3DbeingUpsideDown2D javafx/scene/transform/AffineOperationsTest/testPrependRotationWithZeroAxis javafx/scene/transform/AffineOperationsTest/testPrependRotationWithAlmostZeroAxis javafx/scene/transform/AffineOperationsTest/testPrependPointedAxisRotation3D javafx/scene/transform/AffineOperationsTest/testPrependPointedAxisPointedPivotRotation3D javafx/scene/transform/AffineOperationsTest/prependRotate3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppend2D javafx/scene/transform/AffineOperationsTest/append2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrepend2D javafx/scene/transform/AffineOperationsTest/prepend2DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppend3D javafx/scene/transform/AffineOperationsTest/append3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrepend3D javafx/scene/transform/AffineOperationsTest/prepend3DShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendTransform javafx/scene/transform/AffineOperationsTest/testAppendNullTransform javafx/scene/transform/AffineOperationsTest/appendTransformShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependTransform javafx/scene/transform/AffineOperationsTest/testPrependNullTransform javafx/scene/transform/AffineOperationsTest/prependTransformShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendArray javafx/scene/transform/AffineOperationsTest/testAppendArrayNullMatrix javafx/scene/transform/AffineOperationsTest/testAppendArrayNullType javafx/scene/transform/AffineOperationsTest/appendArray2x3ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/appendArray3x3ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/appendArray3x4ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/appendArray4x4ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendArray2x3ShortArray javafx/scene/transform/AffineOperationsTest/testAppendArray3x3ShortArray javafx/scene/transform/AffineOperationsTest/testAppendArray3x4ShortArray javafx/scene/transform/AffineOperationsTest/testAppendArray4x4ShortArray javafx/scene/transform/AffineOperationsTest/testAppendArray3x3NotAffineX javafx/scene/transform/AffineOperationsTest/testAppendArray3x3NotAffineY javafx/scene/transform/AffineOperationsTest/testAppendArray3x3NotAffineT javafx/scene/transform/AffineOperationsTest/testAppendArray4x4NotAffineX javafx/scene/transform/AffineOperationsTest/testAppendArray4x4NotAffineY javafx/scene/transform/AffineOperationsTest/testAppendArray4x4NotAffineZ javafx/scene/transform/AffineOperationsTest/testAppendArray4x4NotAffineT javafx/scene/transform/AffineOperationsTest/testPrependArray javafx/scene/transform/AffineOperationsTest/testPrependArrayNullMatrix javafx/scene/transform/AffineOperationsTest/testPrependArrayNullType javafx/scene/transform/AffineOperationsTest/prependArray2x3ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/prependArray3x3ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/prependArray3x4ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/prependArray4x4ShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testPrependArray2x3ShortArray javafx/scene/transform/AffineOperationsTest/testPrependdArray3x3ShortArray javafx/scene/transform/AffineOperationsTest/testPrependArray3x4ShortArray javafx/scene/transform/AffineOperationsTest/testPrependArray4x4ShortArray javafx/scene/transform/AffineOperationsTest/prestPrependArray3x3NotAffineX javafx/scene/transform/AffineOperationsTest/prestPrependArray3x3NotAffineY javafx/scene/transform/AffineOperationsTest/prestPrependArray3x3NotAffineT javafx/scene/transform/AffineOperationsTest/prestPrependArray4x4NotAffineX javafx/scene/transform/AffineOperationsTest/prestPrependArray4x4NotAffineY javafx/scene/transform/AffineOperationsTest/prestPrependArray4x4NotAffineZ javafx/scene/transform/AffineOperationsTest/prestPrependArray4x4NotAffineT javafx/scene/transform/AffineOperationsTest/testInvert javafx/scene/transform/AffineOperationsTest/invertShouldBeAtomic javafx/scene/transform/AffineOperationsTest/testAppendInverse javafx/scene/transform/AffineOperationsTest/testSetElement javafx/scene/transform/AffineOperationsTest/testSetElementNullType javafx/scene/transform/TransformOperationsTest/testClone javafx/scene/transform/TransformOperationsTest/testCreateConcatenation javafx/scene/transform/TransformOperationsTest/testCreateConcatenationNullTransform javafx/scene/transform/TransformOperationsTest/testCreateInverse javafx/scene/transform/TransformOperationsTest/createInverseShouldUpdateCache javafx/scene/transform/TransformOperationsTest/testTransformPoint3d javafx/scene/transform/TransformOperationsTest/testTransformNullPoint3d javafx/scene/transform/TransformOperationsTest/testTransformPoint2d javafx/scene/transform/TransformOperationsTest/testTransformNullPoint2d javafx/scene/transform/TransformOperationsTest/testDeltaTransformPoint3d javafx/scene/transform/TransformOperationsTest/testDeltaTransformNullPoint3d javafx/scene/transform/TransformOperationsTest/testDeltaTransformPoint2d javafx/scene/transform/TransformOperationsTest/testDeltaTransformNullPoint2d javafx/scene/transform/TransformOperationsTest/testTransformBounds javafx/scene/transform/TransformOperationsTest/testTransformNullBounds javafx/scene/transform/TransformOperationsTest/testTransform2DPoints javafx/scene/transform/TransformOperationsTest/testTransform2DPointsBothPtsNull javafx/scene/transform/TransformOperationsTest/testTransform2DPointsSrcPtsNull javafx/scene/transform/TransformOperationsTest/testTransform2DPointsDstPtsNull javafx/scene/transform/TransformOperationsTest/testTransform2DPointsWithOverlap javafx/scene/transform/TransformOperationsTest/testTransform2DPointsSrcOut javafx/scene/transform/TransformOperationsTest/testTransform2DPointsDstOut javafx/scene/transform/TransformOperationsTest/testTransform3DPoints javafx/scene/transform/TransformOperationsTest/testTransform3DPointsBothPtsNull javafx/scene/transform/TransformOperationsTest/testTransform3DPointsSrcPtsNull javafx/scene/transform/TransformOperationsTest/testTransform3DPointsDstPtsNull javafx/scene/transform/TransformOperationsTest/testTransform3DPointsWithOverlap javafx/scene/transform/TransformOperationsTest/testTransform3DPointsSrcOut javafx/scene/transform/TransformOperationsTest/testTransform3DPointsDstOut javafx/scene/transform/TransformOperationsTest/testInverseTransformPoint3d javafx/scene/transform/TransformOperationsTest/testInverseTransformNullPoint3d javafx/scene/transform/TransformOperationsTest/testInverseTransformPoint2d javafx/scene/transform/TransformOperationsTest/testInverseTransformNullPoint2d javafx/scene/transform/TransformOperationsTest/testInverseDeltaTransformPoint3d javafx/scene/transform/TransformOperationsTest/testInverseDeltaTransformNullPoint3d javafx/scene/transform/TransformOperationsTest/testInverseDeltaTransformPoint2d javafx/scene/transform/TransformOperationsTest/testInverseDeltaTransformNullPoint2d javafx/scene/transform/TransformOperationsTest/testInverseTransformBounds javafx/scene/transform/TransformOperationsTest/testInverseTransformNullBounds javafx/scene/transform/TransformOperationsTest/testInverseTransform2DPoints javafx/scene/transform/TransformOperationsTest/testInverseTransform2DPointsBothPtsNull javafx/scene/transform/TransformOperationsTest/testInverseTransform2DPointsSrcPtsNull javafx/scene/transform/TransformOperationsTest/testInverseTransform2DPointsDstPtsNull javafx/scene/transform/TransformOperationsTest/testInverseTransform2DPointsWithOverlap javafx/scene/transform/TransformOperationsTest/testInverseTransform2DPointsSrcOut javafx/scene/transform/TransformOperationsTest/testInverseTransform2DPointsDstOut javafx/scene/transform/TransformOperationsTest/testInverseTransform3DPoints javafx/scene/transform/TransformOperationsTest/testInverseTransform3DPointsBothPtsNull javafx/scene/transform/TransformOperationsTest/testInverseTransform3DPointsSrcPtsNull javafx/scene/transform/TransformOperationsTest/testInverseTransform3DPointsDstPtsNull javafx/scene/transform/TransformOperationsTest/testInverseTransform3DPointsWithOverlap javafx/scene/transform/TransformOperationsTest/testInverseTransform3DPointsSrcOut javafx/scene/transform/TransformOperationsTest/testInverseTransform3DPointsDstOut javafx/scene/transform/TransformOperationsTest/testDeterminant javafx/scene/transform/TransformOperationsTest/testIsType2D javafx/scene/transform/TransformOperationsTest/testType2DProperty javafx/scene/transform/TransformOperationsTest/testType2DPropertyGetter javafx/scene/transform/TransformOperationsTest/testType2DPropertyInvalidation javafx/scene/transform/TransformOperationsTest/testType2DPropertyChange javafx/scene/transform/TransformOperationsTest/testIsIdentity javafx/scene/transform/TransformOperationsTest/testIdentityProperty javafx/scene/transform/TransformOperationsTest/testIdentityPropertyGetter javafx/scene/transform/TransformOperationsTest/testIdentityPropertyInvalidation javafx/scene/transform/TransformOperationsTest/testIdentityPropertyChange javafx/scene/transform/TransformOperationsTest/testSimilarTo javafx/scene/transform/TransformOperationsTest/testSimilarToNullTransform javafx/scene/transform/TransformOperationsTest/testSimilarToNullRange javafx/scene/transform/TransformOperationsTest/testGetElement javafx/scene/transform/TransformOperationsTest/testGetElementNullType javafx/scene/transform/TransformOperationsTest/testToArray javafx/scene/transform/TransformOperationsTest/testToArrayNullType1 javafx/scene/transform/TransformOperationsTest/testToArrayNullType2 javafx/scene/transform/TransformOperationsTest/testRow javafx/scene/transform/TransformOperationsTest/testRowNullType1 javafx/scene/transform/TransformOperationsTest/testRowNullType2 javafx/scene/transform/TransformOperationsTest/testColumn javafx/scene/transform/TransformOperationsTest/testColumnNullType1 javafx/scene/transform/TransformOperationsTest/testColumnNullType2 javafx/scene/transform/TransformOperationsTest/testSetOnTtransformChanged javafx/scene/transform/TransformOperationsTest/testAddRemoveEventHandler javafx/scene/transform/TransformOperationsTest/testAddRemoveEventFilter
10-09-2012

The API added by changeset 9d384fe5774f.
10-09-2012

Passing to CCR for Lombard. This is an essential API for most of the complex graphical applications. Without it users are forced to awkwardly workaround lack of transform operations by converting all the transforms back an forth to some other libraries.
06-09-2012

In a thorough discussion the following API has been agreed: New enum MatrixType { MT_2D_2x3, MT_2D_3x3, MT_3D_3x4, MT_3D_4x4 } // specifies type of matrix // causes IllegalArgumentException whenever a 2D type is requested for a 3D transform public int rows() public int columns() public int elements() public boolean is2D() New NonInvertibleTransformException New TransformChangedEvent with single event type TRANSFORM_CHANGED On Point3D class: public double distance(double x, double y, double z) public double distance(Point3D point) // Gets distance from the given point public Point3D add(double x, double y, double z) public Point3D add(Point3D point) // Creates a point with coordinates added public Point3D subtract(double x, double y, double z) public Point3D subtract(Point3D point) // Creates a point with the coordinates subtracted public Point3D normalize() // Normalizes a vector represented by Point3D public Point3D midpoint(double x, double y, double z) public Point3D midpoint(Point3D point) // Gets center between the two points public double angle(double x, double y, double z) public double angle(Point3D point) // Gets angle between two vectors represented by Point3D public double angle(Point3D p1, Point3D p2) // Gets angle between the given points when observed from this point public double magnitude() // Gets magnitude of the vector represented by this Point3D public Point3D crossProduct(double x, double y, double z) public Point3D crossProduct(Point3D vector) public double dotProduct(double x, double y, double z) public double dotProduct(Point3D vector) // Compute product of the two vectors represented by Point3D On Point2D: // similar to Point3D mapped to 2D (except of crossProduct still returning Point3D) On Transform class: public Transform createConcatenation(Transform transform) // Creates new concatenated transform that is equivalent to // this transform being first in a transformation list and the given transform second // Means multiplication on the right by the given transform public Transform createInverse() throws NoninvertibleTransformException // Creates a negated transform public Transform clone() // Of course Transform implementing Cloneable // in subclasses the above methods will be overridden and will return more specific types where possible public Point3D transform(double x, double y, double z) public Point3D transform(Point3D point) // Transforms the point public Point2D transform(double x, double y) public Point2D transform(Point2D point) // throws IllegalState for 3D transform public Bounds transform(Bounds bounds) // Transforms the bounds public void transform2DPoints(double[] srcPts, int srcOffset, double[] dstPts, int dstOffset, int numPts) // similar to J2D public void transform3DPoints(double[] srcPts, int srcOffset, double[] dstPts, int dstOffset, int numPts) // similar to the above but with tree coordinates per point public inverseTransform* // 7 methods // one counterpart for each transform* public Point3D deltaTransform(double x, double y, double z) public Point3D deltaTransform(Point3D point) public Point2D deltaTransform(double x, double y) public Point2D deltaTransform(Point2D point) // transformation without translation (transformation of a vector) public inverseDeltaTransform // 4 methods // inverse transformation without translation public double determinant() public boolean isType2D() public ReadOnlyBooleanProperty type2DProperty() public boolean isIdentity() public ReadOnlyBooleanProperty identityProperty() public Transform.similarTo(Transform transform, Bounds range, double maximumDelta) // Test similarity to the given transform // Returns true if all points inside range are translated to points no farther than maximumDelta public double getElement(MatrixType type, int row, int column) // Convenience getter for the individual elements // throws IndexOutOfBounds if index out of the range specified by type public double[] toArray(MatrixType type) // Returns flattened matrix specified by type public double[] toArray(MatrixType type, double[] array) // Similar to the above, just uses the passed array if it is big enough public double[] row(MatrixType type, int row) public double[] row(MatrixType type, int row, double[] array) public double[] column(MatrixType type, int column) public double[] column(MatrixType type, int column, double[] array) // Similar to toAarray returning the particular tuples // throw IndexOutOfBounds if index out of the range specified by type // Support for the transform changed event: // Transform will implement EventTarget interface protected void transformChanged() // for the subclasses to call when the transform changes public <T extends Event> void addEventFilter(EventType<T> eventType, EventHandler<? super T> eventHandler) public <T extends Event> void removeEventFilter(EventType<T> eventType, EventHandler<? super T> eventHandler) public <T extends Event> void addEventHandler(final EventType<T> eventType, final EventHandler<? super T> eventHandler) public <T extends Event> void removeEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler) public void setOnTransformChanged(EventHandler<? super TransformChangedEvent> value) public EventHandler<? super TransformChangedEvent> getOnTransformChanged() public ObjectProperty<EventHandler<? super TransformChangedEvent>> onTransformChangedProperty() On Affine class: 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[] array, MatrixType type, int offset) // reads number of elements specified by "type" // from index specified by "offset" // throws IndexOutOfBounds if the array is not long enough or // if the last 3x3 or 4x4 matrix row is set to something different than 0, 0, (0,) 1 public void setToTransform(Transform transform) 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 tx, double myx, double myy, double myz, double ty, double mzx, double mzy, double mzz, double tz) public void setToTransform(double[] array, MatrixType type, int offset) // the same acceptance criteria as the constructor public void setToIdentity() public void invert() throws NoninvertibleTransformException public void append(Transform t) // multiplying on the right public void append(double mxx, double mxy, double tx, double myx, double myy, double ty) public void append(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 void append(double[] array, MatrixType type, int offset) 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, Point2D pivot) 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 appendScale(double sx, double sy, double sz, Point3D pivot) public void appendRotation(double angle) public void appendRotation(double angle, double pivotX, double pivotY) public void appendRotation(double angle, Point2D pivot) public void appendRotation(double angle, double pivotX, double pivotY, double pivotZ, double axisX, double axisY, double axisZ) public void appendRotation(double angle, double pivotX, double pivotY, double pivotZ, Point3D axis) public void appendRotation(double angle, Point3D pivot, Point3D axis) public void appendShear(double shx, double shy) public void appendShear(double shx, double shy, double pivotX, double pivotY) public void appendShear(double shx, double shy, Point2D pivot) // "append" means "add the transformation after the existing one", so // "append" means multiply this matrix on the right by the given matrix public void prepend* // 20 methods // Every append* method has its prepend* counterpart, // adding the transformation before the existing one, // multiplying on the left public void setElement(MatrixType type, int row, int col, double value) // convenience setter for the individual elements // allows to set the last row of 3x3 or 4x4 matrix only to 0, 0, (0,) 1 // throws IllegalArgument if the above condition is not met // trows IndexOutOfBounds if one of the indices out of specified matrix type
06-09-2012

I would really like to have this in 2.2, but it is a lot of API that needs to be carefully designed and that will probably need an huge amount of optimization code for its performance to be reasonable. I'm sorry but we are not able to make this happen for this release.
17-05-2012

We are now past feature freeze for 2.2, and this was never on the list of 2.2 features, so as far as I am concerned the target release is correct.
16-05-2012

Is the fix version correct? Is this only targeted at lombard? I think this should be 2.2
16-05-2012

Affine class should contain methods for altering the matrix in place (inverse(), concatenate(Transform), setTransform(Transform), ..). The methods that return a new instance (getInverseTransform(), getConcatenation(), ...) should be present on Transform class. Affine should also contain methods for setting it (and/or factory methods for creating it) to a specific simple transformation, that could be used similarly to the factory methods on Transform class, but returning the Affine class. Also convenient methods as concatenateWithRotation may be useful. We definitely should have Point3D transform(Point3D) on Transform class. Consider other possible arguments as bounds etc.
16-05-2012

You could do this with Java3D, and I think they their API was interesting.
04-05-2012

I recently experimented a bit with the graphic features of JavaFX (Shapes, Group-Nodes and Transforms). One thing I very quickly stumbled over is the missing support for any kind of mathematical operations on (Affine) transforms. You can neither get at the matrix elements of a Scale, Translate, etc. (because these Affine transforms are not even a sub-class of Affine) nor could you perform any operations on them like for example combining two transforms into one or applying the transform or its inverse to a point. Sometimes even the documentation is wrong (see for example Scale: The description of the matrix completely ignores the pivot element which is an integral part of this class.) I really wonder how you can write any sophisticated graphics program without support for such kind of operations. Is there any magic way around this, which I don't know or has just nobody ever tried to do that? Further comments can be found in the thread "JavaFX and (Affine)Transforms" on the openjfx-dev@openjdk.java.net mailing list.
04-05-2012

Affine transform is also an important part of Geographic Information Systems (GIS). Some implementations make an extensive use of java.awt.geom.AffineTransform and can not yet switch to the JavaFX transform classes in their current form. Almost every methods in the Java2D AffineTransform class are valuable, with special emphasis on: * transform(double[], int, double[], int, int) * transform(float[], int, float[], int, int) * transform(float[], int, double[], int, int) * transform(double[], int, float[], int, int) * concatenate(AffineTransform) * preConcatenate(AffineTransform) * getMatrix(double[]) * getScaleX(), getScaleY(), getShearX(), etc. * inverse(); Notes: Java2D AffineTransform is modifiable, while JavaFX transform classes seem to be immutable. Immutable transforms with 'concatenate' and similar methods returning new instances are fine. Transform methods working at arbitrary indexes of existing arrays are essential. GIS are typically transforming million of coordinates in their own geometry structures, not only for display purpose. We only need 'float[]' and 'double[]' array types (no need for 'int[]' for example). The 'double[]' type is essential - map projections in float precision have unacceptable errors. For example longitude/latitude angles in decimal degrees have a precision of approximatively one meter when using type 'float', while a centimeter accuracy is often required. The 'transform' methods mixing the arrays of 'float' and 'double' types in their signature are important. They are used in the following scenario, where to source of step 1 and and target of step 3 are arrays of type 'float[]', but the intermediate map projection must be performed in 'double' precision: 1. First, an affine transform for applying axis reordering, unit conversion, prime meridian rotation. The source array for this step may be 'float' or 'double', but the destination array must be 'double'. 2. Then the map projection is applied on the result of step 1 above. This projection must be performed on array of type 'double', otherwise errors are too high. 3. Finally, an affine transform is applied on the result of step 2 above, for applying scale factor, easting, northing, unit conversion and axis reordering. The source array for this step is always 'double', but the destination array may be 'double' or 'float'. In summary, the current Java2D AffineTransform API is excellent in my opinion. Having equivalent functionalities in JavaFX would be nice (hardware acceleration would be wonderful), eventually as immutable classes.
04-05-2012