/* * 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.so; import java.io.Serializable; /** * <p> * Specifies a 3D rotation using a quaternion. q = w + x*i + y*j + z*k, where (w,x,y,z) are the parameters of * the quaternion and (i,j,k) are unit vectors representing the Cartesian axis. * </p> * * <p> * If the quaternion is a unit quaternion then the following is true:<br> * q = cos(theta/2) + (x*i + y*j + z*k)*sin(theta/2)<br> * where 'theta' is the angle of rotation, (x,y,z) is the unit axis of rotation. * </p> * * @author Peter Abeles */ public class Quaternion_F64 implements Serializable { /** * Describes the angle of rotation. See above for how it is encoded. */ public double w; /** * Axis of rotation */ public double x,y,z; public Quaternion_F64() { w = 1; } public Quaternion_F64(double w, double x, double y, double z) { set(w, x, y, z); } public void set( Quaternion_F64 quaternion ) { this.w = quaternion.w; this.x = quaternion.x; this.y = quaternion.y; this.z = quaternion.z; } public void set( double w, double x, double y, double z ) { this.w = w; this.x = x; this.y = y; this.z = z; } /** * Converts the quaternion into a unit quaternion. */ public void normalize() { double n = Math.sqrt( w * w + x * x + y * y + z * z); w /= n; x /= n; y /= n; z /= n; } @Override public String toString() { return getClass().getSimpleName()+"{ w = "+ w +" axis( "+ x +" "+ y +" "+ z +") }"; } }