Implemented affine inverse transforms without creating an intermediate inverted
transform.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user