@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 1 : "1d affine transformations can be applied to 1d points only."; if ( isInvertible ) l[ 0 ] = l[ 0 ] * i00 + i01; else throw new NoninvertibleModelException( "Model not invertible." ); }
errorMessage = "ImageTransform.process(): " + e.getMessage(); return false;
@Override final protected void addHandle( final int x, final int y ) { final double[] l = new double[]{ x, y }; synchronized ( mesh ) { final InvertibleCoordinateTransform ict = ( InvertibleCoordinateTransform )mesh.findClosest( l ).getModel(); try { ict.applyInverseInPlace( l ); final Point here = new Point( l ); final Point there = new Point( l ); hooks.add( here ); here.apply( ict ); mesh.addMatchWeightedByDistance( new PointMatch( there, here, 10f ), alpha ); } catch ( final NoninvertibleModelException e ){ e.printStackTrace(); } } }
errorMessage = "ImageTransform.process(): " + e.getMessage(); return false;
@Override final protected void addHandle( final int x, final int y ) { final double[] l = new double[]{ x, y }; synchronized ( mesh ) { final InvertibleCoordinateTransform ict = ( InvertibleCoordinateTransform )mesh.findClosest( l ).getModel(); try { ict.applyInverseInPlace( l ); final Point here = new Point( l ); final Point there = new Point( l ); hooks.add( here ); here.apply( ict ); mesh.addMatchWeightedByDistance( new PointMatch( there, here, 10f ), alpha ); } catch ( final NoninvertibleModelException e ){ e.printStackTrace(); } } }
@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 1 : "1d affine transformations can be applied to 1d points only."; if ( isInvertible ) l[ 0 ] = l[ 0 ] * i00 + i01; else throw new NoninvertibleModelException( "Model not invertible." ); }
errorMessage = "ImageTransform.process(): " + e.getMessage(); return false;
@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 2 : "2d affine transformations can be applied to 2d points only."; if ( isInvertible ) { final double l0 = l[ 0 ]; l[ 0 ] = l0 * i00 + l[ 1 ] * i01 + i02; l[ 1 ] = l0 * i10 + l[ 1 ] * i11 + i12; } else throw new NoninvertibleModelException( "Model not invertible." ); }
@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 2 : "2d affine transformations can be applied to 2d points only."; if ( isInvertible ) { final double l0 = l[ 0 ]; l[ 0 ] = l0 * i00 + l[ 1 ] * i01 + i02; l[ 1 ] = l0 * i10 + l[ 1 ] * i11 + i12; } else throw new NoninvertibleModelException( "Model not invertible." ); }
@Override public void applyInverseInPlace(double[] l) throws NoninvertibleModelException { if ( isInvertible ) { final double l0 = l[ 0 ]; final double l1 = l[ 1 ]; l[ 0 ] = l0 * i00 + l1 * i01 + l[ 2 ] * i02 + i03; l[ 1 ] = l0 * i10 + l1 * i11 + l[ 2 ] * i12 + i13; l[ 2 ] = l0 * i20 + l1 * i21 + l[ 2 ] * i22 + i23; } else throw new NoninvertibleModelException( "Model not invertible." ); }
@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 3 : "3d affine transformations can be applied to 3d points only."; if ( isInvertible ) { final double l0 = l[ 0 ]; final double l1 = l[ 1 ]; l[ 0 ] = l0 * i00 + l1 * i01 + l[ 2 ] * i02 + i03; l[ 1 ] = l0 * i10 + l1 * i11 + l[ 2 ] * i12 + i13; l[ 2 ] = l0 * i20 + l1 * i21 + l[ 2 ] * i22 + i23; } else throw new NoninvertibleModelException( "Model not invertible." ); }
@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 3 : "3d affine transformations can be applied to 3d points only."; if ( isInvertible ) { final double l0 = l[ 0 ]; final double l1 = l[ 1 ]; l[ 0 ] = l0 * i00 + l1 * i01 + l[ 2 ] * i02 + i03; l[ 1 ] = l0 * i10 + l1 * i11 + l[ 2 ] * i12 + i13; l[ 2 ] = l0 * i20 + l1 * i21 + l[ 2 ] * i22 + i23; } else throw new NoninvertibleModelException( "Model not invertible." ); }
@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 3 : "3d affine transformations can be applied to 3d points only."; if ( isInvertible ) { final double l0 = l[ 0 ]; final double l1 = l[ 1 ]; l[ 0 ] = l0 * i00 + l1 * i01 + l[ 2 ] * i02 + i03; l[ 1 ] = l0 * i10 + l1 * i11 + l[ 2 ] * i12 + i13; l[ 2 ] = l0 * i20 + l1 * i21 + l[ 2 ] * i22 + i23; } else throw new NoninvertibleModelException( "Model not invertible." ); }
@Override final public void applyInverseInPlace( final double[] l ) throws NoninvertibleModelException { assert l.length >= 3 : "3d affine transformations can be applied to 3d points only."; if ( isInvertible ) { final double l0 = l[ 0 ]; final double l1 = l[ 1 ]; l[ 0 ] = l0 * i00 + l1 * i01 + l[ 2 ] * i02 + i03; l[ 1 ] = l0 * i10 + l1 * i11 + l[ 2 ] * i12 + i13; l[ 2 ] = l0 * i20 + l1 * i21 + l[ 2 ] * i22 + i23; } else throw new NoninvertibleModelException( "Model not invertible." ); }
@Override public void applyInverseInPlace(double[] l) throws NoninvertibleModelException { if ( isInvertible ) { final double l0 = l[ 0 ]; final double l1 = l[ 1 ]; l[ 0 ] = l0 * i00 + l1 * i01 + l[ 2 ] * i02 + i03; l[ 1 ] = l0 * i10 + l1 * i11 + l[ 2 ] * i12 + i13; l[ 2 ] = l0 * i20 + l1 * i21 + l[ 2 ] * i22 + i23; } else throw new NoninvertibleModelException( "Model not invertible." ); }
final static public double[] createInverse( final double m00, final double m01, final double m02, final double m10, final double m11, final double m12, final double m20, final double m21, final double m22 ) throws NoninvertibleModelException { final double det = det( m00, m01, m02, m10, m11, m12, m20, m21, m22 ); if ( det == 0 ) throw new NoninvertibleModelException( "Matrix not invertible." ); return new double[]{ ( m11 * m22 - m12 * m21 ) / det, ( m02 * m21 - m01 * m22 ) / det, ( m01 * m12 - m02 * m11 ) / det, ( m12 * m20 - m10 * m22 ) / det, ( m00 * m22 - m02 * m20 ) / det, ( m02 * m10 - m00 * m12 ) / det, ( m10 * m21 - m11 * m20 ) / det, ( m01 * m20 - m00 * m21 ) / det, ( m00 * m11 - m01 * m10 ) / det }; }
final static public float[] createInverse( final float m00, final float m01, final float m02, final float m10, final float m11, final float m12, final float m20, final float m21, final float m22 ) throws NoninvertibleModelException { final float det = det( m00, m01, m02, m10, m11, m12, m20, m21, m22 ); if ( det == 0 ) throw new NoninvertibleModelException( "Matrix not invertible." ); return new float[]{ ( m11 * m22 - m12 * m21 ) / det, ( m02 * m21 - m01 * m22 ) / det, ( m01 * m12 - m02 * m11 ) / det, ( m12 * m20 - m10 * m22 ) / det, ( m00 * m22 - m02 * m20 ) / det, ( m02 * m10 - m00 * m12 ) / det, ( m10 * m21 - m11 * m20 ) / det, ( m01 * m20 - m00 * m21 ) / det, ( m00 * m11 - m01 * m10 ) / det }; }
final static public double[] createInverse( final double m00, final double m01, final double m02, final double m10, final double m11, final double m12, final double m20, final double m21, final double m22 ) throws NoninvertibleModelException { final double det = det( m00, m01, m02, m10, m11, m12, m20, m21, m22 ); if ( det == 0 ) throw new NoninvertibleModelException( "Matrix not invertible." ); return new double[]{ ( m11 * m22 - m12 * m21 ) / det, ( m02 * m21 - m01 * m22 ) / det, ( m01 * m12 - m02 * m11 ) / det, ( m12 * m20 - m10 * m22 ) / det, ( m00 * m22 - m02 * m20 ) / det, ( m02 * m10 - m00 * m12 ) / det, ( m10 * m21 - m11 * m20 ) / det, ( m01 * m20 - m00 * m21 ) / det, ( m00 * m11 - m01 * m10 ) / det }; }
final static public float[] createInverse( final float m00, final float m01, final float m02, final float m10, final float m11, final float m12, final float m20, final float m21, final float m22 ) throws NoninvertibleModelException { final float det = det( m00, m01, m02, m10, m11, m12, m20, m21, m22 ); if ( det == 0 ) throw new NoninvertibleModelException( "Matrix not invertible." ); return new float[]{ ( m11 * m22 - m12 * m21 ) / det, ( m02 * m21 - m01 * m22 ) / det, ( m01 * m12 - m02 * m11 ) / det, ( m12 * m20 - m10 * m22 ) / det, ( m00 * m22 - m02 * m20 ) / det, ( m02 * m10 - m00 * m12 ) / det, ( m10 * m21 - m11 * m20 ) / det, ( m01 * m20 - m00 * m21 ) / det, ( m00 * m11 - m01 * m10 ) / det }; }
final public void invert() throws NoninvertibleModelException { final double det = det(); if ( det == 0 ) throw new NoninvertibleModelException( "Matrix not invertible." ); final double i00 = ( m11 * m22 - m12 * m21 ) / det; final double i01 = ( m02 * m21 - m01 * m22 ) / det; final double i02 = ( m01 * m12 - m02 * m11 ) / det; final double i10 = ( m12 * m20 - m10 * m22 ) / det; final double i11 = ( m00 * m22 - m02 * m20 ) / det; final double i12 = ( m02 * m10 - m00 * m12 ) / det; final double i20 = ( m10 * m21 - m11 * m20 ) / det; final double i21 = ( m01 * m20 - m00 * m21 ) / det; final double i22 = ( m00 * m11 - m01 * m10 ) / det; m00 = i00; m01 = i01; m02 = i02; m10 = i10; m11 = i11; m12 = i12; m20 = i20; m21 = i21; m22 = i22; }