/*
* 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.transform.se;
import georegression.geometry.ConvertRotation3D_F32;
import georegression.misc.GrlConstants;
import georegression.struct.EulerType;
import georegression.struct.point.Point2D_F32;
import georegression.struct.point.Point3D_F32;
import georegression.struct.point.Vector3D_F32;
import georegression.struct.se.Se2_F32;
import georegression.struct.se.Se3_F32;
import org.ejml.data.DenseMatrix64F;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* @author Peter Abeles
*/
public class TestSePointOps_F32 {
@Test
public void transform_2d_single() {
Se2_F32 tran = new Se2_F32( -2, 3, (float)Math.PI );
Point2D_F32 pt = new Point2D_F32( 2, 4 );
// see if it creates a new instance correctly
Point2D_F32 found = SePointOps_F32.transform( tran, pt, null );
assertEquals( -4, found.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( -1, found.getY(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 2, pt.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 4, pt.getY(), GrlConstants.FLOAT_TEST_TOL );
// now provide it an input to work off of
found.set( 10, 10 );
SePointOps_F32.transform( tran, pt, found );
assertEquals( -4, found.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( -1, found.getY(), GrlConstants.FLOAT_TEST_TOL );
// modify the original
SePointOps_F32.transform( tran, pt, pt );
assertEquals( -4, pt.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( -1, pt.getY(), GrlConstants.FLOAT_TEST_TOL );
}
@Test
public void transformReverse_2d_single() {
Se2_F32 tran = new Se2_F32( -2, 3, (float)Math.PI / 2.0f );
Point2D_F32 pt = new Point2D_F32( 2, 4 );
// see if it creates a new instance correctly
Point2D_F32 found = SePointOps_F32.transformReverse( tran, pt, null );
assertEquals( 1, found.getX(), GrlConstants.FLOAT_TEST_TOL);
assertEquals( -4, found.getY(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 2, pt.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 4, pt.getY(), GrlConstants.FLOAT_TEST_TOL );
// now provide it an input to work off of
found.set( 10, 10 );
SePointOps_F32.transformReverse( tran, pt, found );
assertEquals( 1, found.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( -4, found.getY(), GrlConstants.FLOAT_TEST_TOL );
// modify the original
SePointOps_F32.transformReverse( tran, pt, pt );
assertEquals( 1, pt.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( -4, pt.getY(), GrlConstants.FLOAT_TEST_TOL );
}
@Test
public void transform_2d_array() {
Se2_F32 tran = new Se2_F32( -2, 3, (float)Math.PI );
Point2D_F32 pts[] = new Point2D_F32[20];
for( int i = 0; i < pts.length; i++ ) {
pts[i] = new Point2D_F32( 2, 4 );
}
int N = 12;
SePointOps_F32.transform( tran, pts, N );
for( int i = 0; i < N; i++ ) {
assertEquals( -4, pts[i].getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( -1, pts[i].getY(), GrlConstants.FLOAT_TEST_TOL );
}
// see if the stuff after N has not been modified
for( int i = N; i < pts.length; i++ ) {
assertEquals( 2, pts[i].getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 4, pts[i].getY(), GrlConstants.FLOAT_TEST_TOL );
}
}
@Test
public void transform_2d_list() {
Se2_F32 tran = new Se2_F32( -2, 3, (float)Math.PI );
List<Point2D_F32> pts = new ArrayList<Point2D_F32>();
for( int i = 0; i < 20; i++ ) {
pts.add( new Point2D_F32( 2, 4 ) );
}
SePointOps_F32.transform( tran, pts );
for( Point2D_F32 pt : pts ) {
assertEquals( -4, pt.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( -1, pt.getY(), GrlConstants.FLOAT_TEST_TOL );
}
}
@Test
public void transform_3d_single() {
DenseMatrix64F R = ConvertRotation3D_F32.eulerToMatrix(EulerType.XYZ, 0, (float)Math.PI / 2, 0, null );
Vector3D_F32 T = new Vector3D_F32( 1, 2, 3 );
Point3D_F32 P = new Point3D_F32( 1, 7, 9 );
Point3D_F32 Pt = new Point3D_F32();
Se3_F32 se = new Se3_F32( R, T );
SePointOps_F32.transform( se, P, Pt );
assertEquals( 10, Pt.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 9, Pt.getY(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 2, Pt.getZ(), GrlConstants.FLOAT_TEST_TOL );
}
@Test
public void transformReverse_3d_single() {
DenseMatrix64F R = ConvertRotation3D_F32.eulerToMatrix(EulerType.XYZ, 0, (float)Math.PI / 2, 0, null );
Vector3D_F32 T = new Vector3D_F32( 1, 2, 3 );
Point3D_F32 P = new Point3D_F32( 10, 9, 2 );
Point3D_F32 Pt = new Point3D_F32();
Se3_F32 se = new Se3_F32( R, T );
SePointOps_F32.transformReverse( se, P, Pt );
assertEquals( 1, Pt.getX(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 7, Pt.getY(), GrlConstants.FLOAT_TEST_TOL );
assertEquals( 9, Pt.getZ(), GrlConstants.FLOAT_TEST_TOL );
}
}