/*
* Copyright (C) 2011-2015, Peter Abeles. All Rights Reserved.
*
* This file is part of Geometric Regression Library (GeoRegression).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package georegression.struct;
import java.io.Serializable;
/**
* <p>
* Any transform which has an unique inverse. T(u) = v and u = T<sup>-1</sup>(v).
* </p>
* <p>
* Functions are provided to determining the dimensionality of the transform, inverting the transform,
* and concating two transforms.
* </p>
* <p>
* Design Note: A function to apply the transform has not been provided to any
* data structures (e.g. {@link GeoTuple}). Instead that has been pushed off onto specialized static
* functions in other classes due to the large number of needed functions.
* </p>
*
* @author Peter Abeles
*/
public interface InvertibleTransform<T extends InvertibleTransform> extends Serializable {
/**
* Returns the dimension of the space which this transform operates on.
*
* @return space's dimension
*/
public int getDimension();
/**
* Creates a new instance of the same SpecialEuclidean as this class.
*
* @return A new instance.
*/
public T createInstance();
/**
* Assigns 'this' to the value of target.
*
* @param target The new value of 'this'.
*/
public void set( T target );
/**
* <p>
* Computes a transform which is the equivalent to applying 'this' then
* the 'second' transform.
* </p>
* <p>
* For example:<br>
* <br>
* Point A = tran2( tran1( A ) );<br>
* Point A = tran12( A );<br>
* <br>
* where tran12 = tran1.concat( tran2 , null );
* </p>
*
* <p>
* NOTE: 'second', 'result', and 'this' must all be unique instances.
* </p>
*
* @param second The second transform which is applied. Not modified.
* @param result A transform which is equivalent to applying the first then the second.
* If null then a new instance is declared. Modified.
* @return The equivalent transform.
*/
public T concat( T second, T result );
/**
* <p>
* Computes a transform which is the inverse of this transform. The 'this' matrix can be passed
* in as an input.
* </p>
* <p>
* Example:<br>
* Point A = tran(B);<br>
* Point B = inv(A);<br>
* <br>
* where inv = invert( tran );
* </p>
*
* @param inverse Where the inverse will be stored. If null a new instance is created. Modified.
* @return The inverse transform.
*/
public T invert( T inverse );
/**
* Sets the transform to its initial state of no transform.
*/
public void reset();
}