Implemented affine inverse transforms without creating an intermediate inverted

transform.
This commit is contained in:
Michael Bayne
2011-07-11 14:41:34 -07:00
parent ede16ab724
commit e90f70a0f6
@@ -295,7 +295,15 @@ public class AffineTransform extends AbstractTransform
@Override // from Transform @Override // from Transform
public Point inverseTransform (IPoint p, Point into) { public Point inverseTransform (IPoint p, Point into) {
return invert().transform(p, into); // TODO float x = p.getX() - tx, y = p.getY() - ty;
float det = m00 * m11 - m01 * m10;
if (Math.abs(det) == 0f) {
// determinant is zero; matrix is not invertible
throw new NoninvertibleTransformException(this.toString());
}
float rdet = 1 / det;
return into.set((x * m11 - y * m01) * rdet,
(y * m00 - x * m10) * rdet);
} }
@Override // from Transform @Override // from Transform
@@ -306,7 +314,15 @@ public class AffineTransform extends AbstractTransform
@Override // from Transform @Override // from Transform
public Vector inverseTransform (IVector v, Vector into) { public Vector inverseTransform (IVector v, Vector into) {
return invert().transform(v, into); // TODO float x = v.getX(), y = v.getY();
float det = m00 * m11 - m01 * m10;
if (Math.abs(det) == 0f) {
// determinant is zero; matrix is not invertible
throw new NoninvertibleTransformException(this.toString());
}
float rdet = 1 / det;
return into.set((x * m11 - y * m01) * rdet,
(y * m00 - x * m10) * rdet);
} }
@Override // from Transform @Override // from Transform