/*
* 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.struct.GeoTuple2D_F64;
import georegression.struct.point.Vector2D_F64;
/**
* <p>
* Special Euclidean transform that has been parameterized with three parameters:
* translation (x,y) and rotation (yaw). First the rotation is applied then the translation.
* </p>
* <p>
* Note that this data structure does not specify the units or coordinate frames.
* </p>
*
* @author Peter Abeles
*/
public class Se2_F64 implements SpecialEuclidean<Se2_F64> {
// the translational component
public Vector2D_F64 T = new Vector2D_F64();
// rotational component parameterized for speed
public double c; // cos(yaw)
public double s; // sin(yaw)
public Se2_F64( GeoTuple2D_F64 T, double yaw ) {
this( T.getX(), T.getY(), yaw );
}
public Se2_F64( double x, double y, double yaw ) {
set( x, y, yaw );
}
public Se2_F64( double x, double y, double cosYaw, double sinYaw ) {
set( x, y, cosYaw, sinYaw );
}
/**
* Constructor which initializes it to no transform
*/
public Se2_F64() {
c=1.0;
}
public void set( double x, double y, double yaw ) {
this.T.set(x, y);
this.c = Math.cos( yaw );
this.s = Math.sin( yaw );
}
public void set( double x, double y, double cosYaw, double sinYaw ) {
this.T.set(x, y);
this.c = cosYaw;
this.s = sinYaw;
}
public void set( Se2_F64 target ) {
this.T.set(target.T);
this.c = target.c;
this.s = target.s;
}
public double getX() {
return T.getX();
}
public void setX( double x ) {
T.setX(x);
}
public double getY() {
return T.getY();
}
public void setY( double y ) {
T.setY(y);
}
public Vector2D_F64 getTranslation() {
return T;
}
public void setTranslation( Vector2D_F64 tran ) {
this.T = tran;
}
public void setTranslation( double x, double y ) {
this.T.set(x, y);
}
public double getYaw() {
return Math.atan2( s, c );
}
public void setYaw( double yaw ) {
this.c = Math.cos( yaw );
this.s = Math.sin( yaw );
}
public double getCosineYaw() {
return c;
}
public double getSineYaw() {
return s;
}
@Override
public int getDimension() {
return 2;
}
@Override
public Se2_F64 createInstance() {
return new Se2_F64();
}
@Override
public Se2_F64 concat( Se2_F64 second, Se2_F64 result ) {
if( result == null )
result = new Se2_F64();
result.setYaw( getYaw() + second.getYaw() );
result.T.x = second.T.x + second.c * T.x - second.s * T.y;
result.T.y = second.T.y + second.s * T.x + second.c * T.y;
return result;
}
@Override
public Se2_F64 invert( Se2_F64 inverse ) {
if( inverse == null )
inverse = new Se2_F64();
double x = -T.x;
double y = -T.y;
inverse.s = -s;
inverse.c = c;
inverse.T.x = c * x + s * y;
inverse.T.y = -s * x + c * y;
return inverse;
}
@Override
public void reset() {
c = 1;
s = 0;
T.set(0, 0);
}
public Se2_F64 copy() {
return new Se2_F64( T.x, T.y, c, s );
}
public String toString() {
return "Se2( x = " + T.x + " y = " + T.y + " yaw = " + getYaw() + " )";
}
public void print() {
System.out.println(this);
}
}