org.jmol.util
Class Quaternion

java.lang.Object
  extended by org.jmol.util.Quaternion

public class Quaternion
extends Object


Field Summary
 Matrix3f mat
           
 float q0
           
 float q1
           
 float q2
           
 float q3
           
private static Quaternion qTemp
           
private static Point4f qZero
           
 
Constructor Summary
Quaternion()
           
Quaternion(AxisAngle4f a)
           
Quaternion(float q0, float q1, float q2, float q3)
           
Quaternion(Matrix3f mat)
           
Quaternion(Point4f pt)
           
Quaternion(Quaternion q)
           
Quaternion(Tuple3f pt, float theta)
           
 
Method Summary
 Quaternion add(float x)
           
 Quaternion div(Quaternion p)
           
static Quaternion[] div(Quaternion[] data1, Quaternion[] data2, int nMax, boolean isRelative)
           
 Quaternion divLeft(Quaternion p)
           
 float dot(Quaternion q)
           
 String draw(String prefix, String id, Point3f ptCenter, float scale)
           
private  void fixQ(Quaternion qNew)
           
 Vector3f get3dProjection(Vector3f v3d)
           
 String getInfo()
           
 Matrix3f getMatrix()
           
 Vector3f getNormal()
           
 Vector3f getNormalDirected(Vector3f v0)
           
static Quaternion getQuaternionFrame(Point3f center, Tuple3f x, Tuple3f xy)
           
static Quaternion getQuaternionFrame(Vector3f vA, Vector3f vB, Vector3f vC, boolean yBased)
           
private static Vector3f getRawNormal(Quaternion q)
           
 float getTheta()
           
 Point4f getThetaDirected(Point4f axisAngle)
           
 float getThetaDirected(Vector3f vector)
           
 float getThetaRadians()
           
 Vector3f getVector(int i)
           
private  Vector3f getVector(int i, float scale)
           
 Quaternion inv()
           
 Quaternion leftDifference(Quaternion q2)
           
 Quaternion mul(float x)
           
 Quaternion mul(Quaternion p)
           
 Quaternion negate()
           
private static Quaternion newMean(Quaternion[] data, Quaternion mean)
           
 Quaternion rightDifference(Quaternion q2)
           
 void set(AxisAngle4f a)
           
 void set(Matrix3f mat)
           
private  void set(Point4f pt)
          {x y z w} --> {q1 q2 q3 q0} and factored
 void set(Quaternion q)
           
 void set(Tuple3f pt, float theta)
          q = (cos(theta/2), sin(theta/2) * n)
private  void setMatrix()
           
 void setRef(Quaternion qref)
           
private static Quaternion simpleAverage(Quaternion[] ndata)
          Just a starting point.
static Quaternion sphereMean(Quaternion[] data, float[] retStddev, float criterion)
           
private static float stdDev(Quaternion[] data, Quaternion mean)
           
 AxisAngle4f toAxisAngle4f()
           
 Point4f toPoint4f()
           
 String toString()
          Java axisAngle / plane / Point4f format all have the format {x y z w} so we go with that here as well
 Point3f transform(Point3f pt)
           
 void transform(Point3f pt, Point3f ptNew)
           
 Vector3f transform(Vector3f v)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

q0

public float q0

q1

public float q1

q2

public float q2

q3

public float q3

mat

public Matrix3f mat

qZero

private static final Point4f qZero

qTemp

private static final Quaternion qTemp
Constructor Detail

Quaternion

public Quaternion()

Quaternion

public Quaternion(Quaternion q)

Quaternion

public Quaternion(Tuple3f pt,
                  float theta)

Quaternion

public Quaternion(Matrix3f mat)

Quaternion

public Quaternion(AxisAngle4f a)

Quaternion

public Quaternion(Point4f pt)

Quaternion

public Quaternion(float q0,
                  float q1,
                  float q2,
                  float q3)
Method Detail

set

public void set(Quaternion q)

set

private void set(Point4f pt)
{x y z w} --> {q1 q2 q3 q0} and factored

Parameters:
pt -

set

public void set(Tuple3f pt,
                float theta)
q = (cos(theta/2), sin(theta/2) * n)

Parameters:
pt -
theta -

set

public void set(AxisAngle4f a)

set

public void set(Matrix3f mat)

setRef

public void setRef(Quaternion qref)

getQuaternionFrame

public static final Quaternion getQuaternionFrame(Point3f center,
                                                  Tuple3f x,
                                                  Tuple3f xy)

getQuaternionFrame

public static final Quaternion getQuaternionFrame(Vector3f vA,
                                                  Vector3f vB,
                                                  Vector3f vC,
                                                  boolean yBased)

getMatrix

public Matrix3f getMatrix()

setMatrix

private void setMatrix()

add

public Quaternion add(float x)

mul

public Quaternion mul(float x)

mul

public Quaternion mul(Quaternion p)

div

public Quaternion div(Quaternion p)

divLeft

public Quaternion divLeft(Quaternion p)

dot

public float dot(Quaternion q)

inv

public Quaternion inv()

negate

public Quaternion negate()

fixQ

private void fixQ(Quaternion qNew)

getVector

public Vector3f getVector(int i)

getVector

private Vector3f getVector(int i,
                           float scale)

getNormal

public Vector3f getNormal()
Returns:
vector such that 0 <= angle <= 180

getRawNormal

private static Vector3f getRawNormal(Quaternion q)

getTheta

public float getTheta()
Returns:
0 <= angle <= 180 in degrees

getThetaRadians

public float getThetaRadians()

getNormalDirected

public Vector3f getNormalDirected(Vector3f v0)
Parameters:
v0 -
Returns:
vector option closest to v0

get3dProjection

public Vector3f get3dProjection(Vector3f v3d)

getThetaDirected

public Point4f getThetaDirected(Point4f axisAngle)
Parameters:
axisAngle -
Returns:
fill in theta of axisAngle such that

getThetaDirected

public float getThetaDirected(Vector3f vector)
Parameters:
vector - a vector, same as for getNormalDirected
Returns:
return theta

toPoint4f

public Point4f toPoint4f()

toAxisAngle4f

public AxisAngle4f toAxisAngle4f()

transform

public Point3f transform(Point3f pt)

transform

public void transform(Point3f pt,
                      Point3f ptNew)

transform

public Vector3f transform(Vector3f v)

leftDifference

public Quaternion leftDifference(Quaternion q2)

rightDifference

public Quaternion rightDifference(Quaternion q2)

getInfo

public String getInfo()

draw

public String draw(String prefix,
                   String id,
                   Point3f ptCenter,
                   float scale)

toString

public String toString()
Java axisAngle / plane / Point4f format all have the format {x y z w} so we go with that here as well

Overrides:
toString in class Object
Returns:
"{q1 q2 q3 q0}"

div

public static Quaternion[] div(Quaternion[] data1,
                               Quaternion[] data2,
                               int nMax,
                               boolean isRelative)
Parameters:
data1 -
data2 -
nMax - > 0 --> limit to this number
isRelative -
Returns:
pairwise array of data1 / data2 or data1 \ data2

sphereMean

public static Quaternion sphereMean(Quaternion[] data,
                                    float[] retStddev,
                                    float criterion)

simpleAverage

private static Quaternion simpleAverage(Quaternion[] ndata)
Just a starting point. get average normal vector scale normal by average projection of vectors onto it create quaternion from this 3D projection

Parameters:
ndata -
Returns:
approximate average

newMean

private static Quaternion newMean(Quaternion[] data,
                                  Quaternion mean)

stdDev

private static float stdDev(Quaternion[] data,
                            Quaternion mean)
Parameters:
data -
mean -
Returns:
standard deviation in units of degrees