include/quaternion.h
branchpyrit
changeset 34 28f6e8b9d5d1
child 44 3763b26244f0
equal deleted inserted replaced
33:83d0200d4c09 34:28f6e8b9d5d1
       
     1 /*
       
     2  * Pyrit Ray Tracer
       
     3  * file: quaternion.h
       
     4  *
       
     5  * Radek Brich, 2006-2007
       
     6  */
       
     7 
       
     8 #ifndef QUATERNION_H
       
     9 #define QUATER_H
       
    10 
       
    11 class Quaternion
       
    12 {
       
    13 public:
       
    14 	union {
       
    15 		struct {
       
    16 			Float a,b,c,d;
       
    17 		};
       
    18 		struct {
       
    19 			Float t,x,y,z;
       
    20 		};
       
    21 	};
       
    22 	Quaternion(): a(0), b(0), c(0), d(0) {};
       
    23 	Quaternion(const Float aa, const Float ab, const Float ac, const Float ad):
       
    24 		a(aa), b(ab), c(ac), d(ad) {};
       
    25 	Quaternion(const Vector3& v): a(1), b(v.x), c(v.y), d(v.z) {};
       
    26 
       
    27 	Vector3 toVector() { return Vector3(b/a, c/a, d/a); };
       
    28 
       
    29 	Quaternion normalize()
       
    30 	{
       
    31 		Float f = 1.0f / sqrtf(a * a + b * b + c * c + d * d);
       
    32 		a *= f;
       
    33 		b *= f;
       
    34 		c *= f;
       
    35 		d *= f;
       
    36 		return *this;
       
    37 	};
       
    38 	Float mag2() const
       
    39 	{
       
    40 		return (a*a + b*b + c*c + d*d);
       
    41 	};
       
    42 	Float mag() const
       
    43 	{
       
    44 		return sqrtf(mag());
       
    45 	};
       
    46 	friend Quaternion operator*(const Quaternion &q1, const Quaternion &q2)
       
    47 	{
       
    48 		return Quaternion(
       
    49 			q1.a*q2.a - q1.b*q2.b - q1.c*q2.c - q1.d*q2.d,
       
    50 			q1.a*q2.b + q1.b*q2.a + q1.c*q2.d - q1.d*q2.c,
       
    51 			q1.a*q2.c - q1.b*q2.d + q1.c*q2.a + q1.d*q2.b,
       
    52 			q1.a*q2.d + q1.b*q2.c - q1.c*q2.b + q1.d*q2.a);
       
    53 	};
       
    54 	friend Float dot(const Quaternion &q1, const Quaternion &q2)
       
    55 	{
       
    56 		return q1.a*q2.a + q1.b*q2.b + q1.c*q2.c + q1.d*q2.d;
       
    57 	};
       
    58 	friend Quaternion conjugate(const Quaternion &q)
       
    59 	{
       
    60 		return Quaternion(q.a, -q.b, -q.c, -q.d);
       
    61 	};
       
    62 };
       
    63 
       
    64 #endif