/*
* 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.se;
import georegression.geometry.ConvertRotation3D_F32;
import georegression.geometry.GeometryMath_F32;
import georegression.misc.GrlConstants;
import georegression.struct.EulerType;
import georegression.struct.affine.Affine2D_F32;
import georegression.struct.point.Point2D_F32;
import georegression.struct.point.Point3D_F32;
import georegression.transform.affine.AffinePointOps_F32;
import georegression.transform.se.SePointOps_F32;
import org.ejml.data.DenseMatrix64F;
import org.ejml.ops.CommonOps;
import org.ejml.ops.MatrixFeatures;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* @author Peter Abeles
*/
public class TestSpecialEuclideanOps_F32 {
@Test
public void toAffine_2D() {
Se2_F32 se = new Se2_F32(1.5f,-3.4f,0.5f);
Affine2D_F32 affine = SpecialEuclideanOps_F32.toAffine(se,null);
Point2D_F32 original = new Point2D_F32(-1.5f,2.3f);
Point2D_F32 found = new Point2D_F32();
Point2D_F32 expected = new Point2D_F32();
SePointOps_F32.transform(se,original,expected);
AffinePointOps_F32.transform(affine, original, found);
assertEquals(expected.x,found.x,GrlConstants.FLOAT_TEST_TOL);
assertEquals(expected.y,found.y,GrlConstants.FLOAT_TEST_TOL);
}
@Test
public void toHomogeneous_3D() {
Se3_F32 se = SpecialEuclideanOps_F32.setEulerXYZ( 0.1f, 2, -0.3f, 2, -3, 4.4f, null );
DenseMatrix64F H = SpecialEuclideanOps_F32.toHomogeneous( se, null );
assertEquals( 4, H.numCols );
assertEquals( 4, H.numRows );
DenseMatrix64F R = se.getR();
for( int i = 0; i < 3; i++ ) {
for( int j = 0; j < 3; j++ ) {
assertTrue( R.get( i, j ) == H.get( i, j ) );
}
assertTrue( 0 == H.get( 3, i ) );
}
assertTrue( se.getX() == H.get( 0, 3 ) );
assertTrue( se.getY() == H.get( 1, 3 ) );
assertTrue( se.getZ() == H.get( 2, 3 ) );
}
@Test
public void toHomogeneous_2D() {
Point2D_F32 pt = new Point2D_F32( 3.4f, -9.21f );
Se2_F32 se = new Se2_F32( -3, 6.9f, -1.3f );
DenseMatrix64F H = SpecialEuclideanOps_F32.toHomogeneous( se, null );
Point2D_F32 expected = SePointOps_F32.transform( se, pt, null );
// convert the point into homogeneous matrix notation
DenseMatrix64F pt_m = new DenseMatrix64F( 3, 1 );
pt_m.set( 0, 0, pt.x );
pt_m.set( 1, 0, pt.y );
pt_m.set( 2, 0, 1 );
DenseMatrix64F found = new DenseMatrix64F( 3, 1 );
CommonOps.mult( H, pt_m, found );
assertEquals( expected.x, found.get( 0, 0 ), GrlConstants.FLOAT_TEST_TOL );
assertEquals( expected.y, found.get( 1, 0 ), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 1, found.get( 2, 0 ), GrlConstants.FLOAT_TEST_TOL );
}
@Test
public void toSe3_F32() {
Se3_F32 se = SpecialEuclideanOps_F32.setEulerXYZ( 0.1f, 2, -0.3f, 2, -3, 4.4f, null );
DenseMatrix64F H = SpecialEuclideanOps_F32.toHomogeneous( se, null );
Se3_F32 found = SpecialEuclideanOps_F32.toSe3_F32( H, null );
assertEquals( se.getX(), found.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( se.getY(), found.getY(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( se.getZ(), found.getZ(), GrlConstants.FLOAT_TEST_TOL );
assertTrue( MatrixFeatures.isIdentical( se.getR(), found.getR(), GrlConstants.FLOAT_TEST_TOL ) );
}
@Test
public void toSe2() {
Se2_F32 se = new Se2_F32( -3, 6.9f, -1.3f );
DenseMatrix64F H = SpecialEuclideanOps_F32.toHomogeneous( se, null );
Se2_F32 found = SpecialEuclideanOps_F32.toSe2( H, null );
assertEquals( se.getX(), found.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( se.getY(), found.getY(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( se.getCosineYaw(), found.getCosineYaw(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( se.getSineYaw(), found.getSineYaw(), GrlConstants.FLOAT_TEST_TOL );
}
@Test
public void setEulerXYZ() {
Point3D_F32 orig = new Point3D_F32( 1, 2, 3 );
Se3_F32 se = SpecialEuclideanOps_F32.setEulerXYZ( 0.1f, 2, -0.3f, 2, -3, 4.4f, null );
Point3D_F32 expected = SePointOps_F32.transform( se, orig, null );
DenseMatrix64F R = ConvertRotation3D_F32.eulerToMatrix(EulerType.XYZ, 0.1f, 2, -0.3f, se.getR() );
Point3D_F32 found = GeometryMath_F32.mult( R, orig, (Point3D_F32) null );
found.x += 2;
found.y += -3;
found.z += 4.4f;
assertTrue( found.isIdentical( expected, GrlConstants.FLOAT_TEST_TOL ) );
}
}