/*
* 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;
import georegression.struct.InvertibleTransform;
import georegression.struct.affine.Affine2D_F32;
import georegression.struct.homography.Homography2D_F32;
import georegression.struct.se.Se2_F32;
/**
* Functions for converting one type of geometric transform into another type. A conversion
* function is only provided if a conversion can be performed with no approximation.
*
* @author Peter Abeles
*/
public class ConvertTransform_F32 {
public static <A extends InvertibleTransform, B extends InvertibleTransform>
B convert( A src , B dst )
{
if( src == null || dst == null )
throw new IllegalArgumentException("Both inputs must not be null");
if( src instanceof Se2_F32 ) {
if( dst instanceof Affine2D_F32 ) {
return (B)convert((Se2_F32)src,(Affine2D_F32)dst);
} else if( dst instanceof Homography2D_F32 ) {
return (B)convert((Se2_F32)src,(Homography2D_F32)dst);
} else if( dst instanceof Se2_F32 ) {
dst.set(src);
return dst;
}
} else if( src instanceof Affine2D_F32 ) {
if( dst instanceof Homography2D_F32 ) {
return (B)convert((Affine2D_F32)src,(Homography2D_F32)dst);
} else if( dst instanceof Affine2D_F32 ) {
dst.set(src);
return dst;
}
} else if( src instanceof Homography2D_F32 ) {
if( dst instanceof Homography2D_F32 ) {
dst.set(src);
return dst;
}
}
throw new IllegalArgumentException("The specified transform is not supported");
}
public static Affine2D_F32 convert( Se2_F32 src , Affine2D_F32 dst ) {
if( dst == null )
dst = new Affine2D_F32();
dst.a11 = src.c;
dst.a12 = -src.s;
dst.a21 = src.s;
dst.a22 = src.c;
dst.tx = src.T.x;
dst.ty = src.T.y;
return dst;
}
public static Homography2D_F32 convert( Se2_F32 src , Homography2D_F32 dst ) {
if( dst == null )
dst = new Homography2D_F32();
dst.a11 = src.c;
dst.a12 = -src.s;
dst.a13 = src.T.x;
dst.a21 = src.s;
dst.a22 = src.c;
dst.a23 = src.T.y;
dst.a31 = 0;
dst.a32 = 0;
dst.a33 = 1;
return dst;
}
public static Homography2D_F32 convert( Affine2D_F32 src , Homography2D_F32 dst ) {
if( dst == null )
dst = new Homography2D_F32();
dst.a11 = src.a11;
dst.a12 = src.a12;
dst.a13 = src.tx;
dst.a21 = src.a21;
dst.a22 = src.a22;
dst.a23 = src.ty;
dst.a31 = 0;
dst.a32 = 0;
dst.a33 = 1;
return dst;
}
}