/*
* 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 georegression.misc.GrlConstants;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Peter Abeles
*/
@SuppressWarnings({"unchecked"})
public abstract class GenericInvertibleTransformTests_F64<T extends GeoTuple_F64> {
public abstract T createRandomPoint();
public abstract InvertibleTransform createRandomTransform();
public abstract T apply( InvertibleTransform se, T point, T result );
/**
* Makes sure that after reset is called the transform applies no transform
*/
@Test
public void testReset() {
InvertibleTransform tran1 = createRandomTransform();
T orig = createRandomPoint();
T before = (T) orig.createNewInstance();
// it should modify the point
apply( tran1, orig, before );
assertFalse( orig.isIdentical( before, GrlConstants.DOUBLE_TEST_TOL ) );
// after reset it shouldn't modify the point
tran1.reset();
apply( tran1, orig, before );
assertTrue( orig.isIdentical( before, GrlConstants.DOUBLE_TEST_TOL ) );
}
/**
* See if applying the two transforms is the same as applying the concat of those
* two transforms once.
*/
@Test
public void testConcat() {
InvertibleTransform tran1 = createRandomTransform();
InvertibleTransform tran2 = createRandomTransform();
InvertibleTransform tran12 = tran1.concat( tran2, null );
T orig = createRandomPoint();
T expected = apply( tran1, orig, null );
expected = apply( tran2, expected, expected );
T found = apply( tran12, orig, null );
assertTrue( found.isIdentical( expected, GrlConstants.DOUBLE_TEST_TOL ) );
// do the same, but providing a place for it to write the result
tran12 = tran1.concat( tran2, createRandomTransform() );
found = apply( tran12, orig, null );
assertTrue( found.isIdentical( expected, GrlConstants.DOUBLE_TEST_TOL ) );
}
/**
* Sees if inverting a transform produces the same solution as the point's
* original location
*/
@Test
public void testInvert() {
InvertibleTransform a = createRandomTransform();
T orig = createRandomPoint();
T tran = apply( a, orig, null );
InvertibleTransform aInv = a.invert( null );
T found = apply( aInv, tran, null );
assertTrue( found.isIdentical( orig, GrlConstants.DOUBLE_TEST_TOL ) );
// do the same, but providing a place for it to write the result
aInv = a.invert( createRandomTransform() );
found = apply( aInv, tran, null );
assertTrue( found.isIdentical( orig, GrlConstants.DOUBLE_TEST_TOL ) );
}
/**
* Makes sure it uses the storage correctlyt
*/
@Test
public void testInvert_input() {
InvertibleTransform aInv = createRandomTransform();
InvertibleTransform a = createRandomTransform();
T orig = createRandomPoint();
T tran = apply( a, orig, null );
assertTrue( aInv == a.invert( aInv ) );
T found = apply( aInv, tran, null );
assertTrue( found.isIdentical( orig, GrlConstants.DOUBLE_TEST_TOL ) );
}
}