  | 
   3D Math Code 
   Submitted by  |   
  
  
It's just some base library for 3D-Math, but I think, it's not bad. Give
it a try. It's not *fully* tested, because I hacked the last files
together this morning... but I think, it's very easy to use.
  
I have included operator overloads for the C++ hardcore freaks, but also
the same set as methods ;-)
  
The Matrix and Quaternion classes return themself after most
functions...
So people can do:
  
Matrix4 mat; 
mat.SetIdentity().Translate(..).Scale().Rotate(...); and so on.
 
 
  Hakuna Matata, 
Sascha 'EvilOne' Salevsky.
 | 
 
 
 
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Mathematics.cpp] - (12,321 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
#include "Mathematics.h"
  // ------------------------------------------------------------
// Vector2
// ------------------------------------------------------------
ostream& operator<<(ostream& os, Vector2& v)
{
  os << "(" << setprecision(4) << v.x << ", "  << v.y << ")";
  return os;
}
  // ------------------------------------------------------------
// Vector3
// ------------------------------------------------------------
ostream& operator<<(ostream& os, Vector3& v)
{
  os << "(" << setprecision(4) << v.x << ", "  << v.y << ", "  << v.z << ")";
  return os;
}
  // ------------------------------------------------------------
// Plane
// ------------------------------------------------------------
ostream& operator<<(ostream& os, Plane& p)
{
  os << "(" << setprecision(4) << p.a << ", " 
	 << p.b << ", "  << p.c << ", " << p.d << ")";
  return os;
}
  // ------------------------------------------------------------
// Matrix3
// ------------------------------------------------------------
float Matrix3::Identity_Matrix[] =
{
	1.0f, 0.0f, 0.0f,
	0.0f, 1.0f, 0.0f,
	0.0f, 0.0f, 1.0f
};
  ostream& operator<<(ostream& os, Matrix3 &m)
{
	os << setprecision(4);
	os << "(" << m.M[0]  << ", " << m.M[1]  << ", " << m.M[2] << ", " << endl
	   << " " << m.M[3]  << ", " << m.M[4]  << ", " << m.M[5] << ", " << endl
	   << " " << m.M[6]  << ", " << m.M[7]  << ", " << m.M[8] << ")";
	return os;
}
  // ------------------------------------------------------------
// Matrix4
// ------------------------------------------------------------
float Matrix4::Identity_Matrix[] =
{
	1.0f, 0.0f, 0.0f, 0.0f,
	0.0f, 1.0f, 0.0f, 0.0f,
	0.0f, 0.0f, 1.0f, 0.0f,
	0.0f, 0.0f, 0.0f, 1.0f
};
  float Matrix4::Orientation_Switch_Matrix[] =
{
	1.0f, 0.0f, 0.0f, 0.0f,
	0.0f, 1.0f, 0.0f, 0.0f,
	0.0f, 0.0f, -1.0f, 0.0f,
	0.0f, 0.0f, 0.0f, 1.0f
};
  float Matrix4::Perspective_Matrix[] =
{
	1.0f, 0.0f, 0.0f, 0.0f,
	0.0f, 1.0f, 0.0f, 0.0f,
	0.0f, 0.0f, 1.0f, -1.0f,
	0.0f, 0.0f, 0.0f, 0.0f
};
  void Matrix4::Assign(const Quaternion& other)
{
    float xx = other.x * other.x;
    float xy = other.x * other.y;
    float xz = other.x * other.z;
    float xw = other.x * other.w;
      float yy = other.y * other.y;
    float yz = other.y * other.z;
    float yw = other.y * other.w;
      float zz = other.z * other.z;
    float zw = other.z * other.w;
      M[0]  = 1.0f - 2.0f * (yy + zz);
    M[1]  =        2.0f * (xy - zw);
    M[2]  =        2.0f * (xz + yw);
      M[4]  =        2.0f * (xy + zw);
    M[5]  = 1.0f - 2.0f * (xx + zz);
    M[6]  =        2.0f * (yz - xw);
      M[8]  =        2.0f * (xz - yw);
    M[9]  =        2.0f * (yz + xw);
    M[10] = 1.0f - 2.0f * (xx + yy);
      M[3]  = M[7] = M[11] = M[12] = M[13] = M[14] = 0.0f;
    M[15] = 1.0f;
}
  
Matrix4& Matrix4::SetRotate(float rx, float ry, float rz)
{
	float a = CosD(rx); float b = SinD(rx);
	float c = CosD(ry); float d = SinD(ry);
	float e = CosD(rz); float f = SinD(rz);
	float ad = a * d;
	float bd = b * d;
  	M[0] =  c * e;
	M[1] = -c * f;
	M[2] = -d;
  	M[4] = -bd * e + a * f;
	M[5] =  bd * f + a * e;
	M[6] = -b * c;
  	M[8] =  ad * e + b * f;
	M[9] = -ad * f + b * e;
	M[10] =  a * c;
  	M[3] = M[7] = M[11] = M[12] = M[13] = M[14] = 0.0f;
	M[15] = 1.0f;
	return *this;
}
  Matrix4& Matrix4::SetRotate(float angle, float x, float y, float z)
{
	float xx, yy, zz, xy, yz, zx, xs, ys, zs, c_complement;
	float s = SinD(angle);
	float c = SinD(angle);
	float magnitude = (float)sqrt(x * x + y * y + z * z);
	float *data = M;
	if(magnitude == 0.0f)
	{
		SetIdentity();
		return *this;
	}
	x /= magnitude;
	y /= magnitude;
	z /= magnitude;
	xx = x * x;
	yy = y * y;
	zz = z * z;
	xy = x * y;
	yz = y * z;
	zx = z * x;
	xs = x * s;
	ys = y * s;
	zs = z * s;
	c_complement = 1.0F - c;
	data[0] = (c_complement * xx) + c;
	data[4] = (c_complement * xy) - zs;
	data[8] = (c_complement * zx) + ys;
	data[12] = 0.0F;
	data[1] = (c_complement * xy) + zs;
	data[5] = (c_complement * yy) + c;
	data[9] = (c_complement * yz) - xs;
	data[13] = 0.0F;
	data[2] = (c_complement * zx) - ys;
	data[6] = (c_complement * yz) + xs;
	data[10] = (c_complement * zz) + c;
	data[14] = 0.0F;
	data[3] = 0.0F;
	data[7] = 0.0F;
	data[11] = 0.0F;
	data[15] = 1.0F;
	return *this;
}
  Matrix4& Matrix4::Transpose()
{
	Transpose(*this);
	return *this;
}
  Matrix4& Matrix4::Transpose(const Matrix4& other)
{
	for(int i = 0; i < 4; i++)
	{
		for(int j = 0; j < 4; j++)
		M[i * 4 + j] = other.M[j * 4 + i];
	}
	return *this;
}
  Matrix4& Matrix4::Adjoint()
{
	Matrix4 tmp;
	tmp.Assign(*this);
	Adjoint(tmp);
	return *this;
}
  Matrix4& Matrix4::Adjoint(const Matrix4& other)
{
	float a1, a2, a3, a4, b1, b2, b3, b4;
	float c1, c2, c3, c4, d1, d2, d3, d4;
	const float *in = other.M;
	float *out = M;
  	a1 = (in [(( 0 ) << 2) + (  0 )]) ; b1 = (in [(( 0 ) << 2) + (  1 )]) ;
	c1 = (in [(( 0 ) << 2) + (  2 )]) ; d1 = (in [(( 0 ) << 2) + (  3 )]) ;
	a2 = (in [(( 1 ) << 2) + (  0 )]) ; b2 = (in [(( 1 ) << 2) + (  1 )]) ;
	c2 = (in [(( 1 ) << 2) + (  2 )]) ; d2 = (in [(( 1 ) << 2) + (  3 )]) ;
	a3 = (in [(( 2 ) << 2) + (  0 )]) ; b3 = (in [(( 2 ) << 2) + (  1 )]) ;
	c3 = (in [(( 2 ) << 2) + (  2 )]) ; d3 = (in [(( 2 ) << 2) + (  3 )]) ;
	a4 = (in [(( 3 ) << 2) + (  0 )]) ; b4 = (in [(( 3 ) << 2) + (  1 )]) ;
	c4 = (in [(( 3 ) << 2) + (  2 )]) ; d4 = (in [(( 3 ) << 2) + (  3 )]) ;
  	out[(( 0 ) << 2) + (  0 )]   =   Det3x3( b2, b3, b4, c2, c3, c4, d2, d3, d4);
	out[(( 1 ) << 2) + (  0 )]   = - Det3x3( a2, a3, a4, c2, c3, c4, d2, d3, d4);
	out[(( 2 ) << 2) + (  0 )]   =   Det3x3( a2, a3, a4, b2, b3, b4, d2, d3, d4);
	out[(( 3 ) << 2) + (  0 )]   = - Det3x3( a2, a3, a4, b2, b3, b4, c2, c3, c4);
  	out[(( 0 ) << 2) + (  1 )]   = - Det3x3( b1, b3, b4, c1, c3, c4, d1, d3, d4);
	out[(( 1 ) << 2) + (  1 )]   =   Det3x3( a1, a3, a4, c1, c3, c4, d1, d3, d4);
	out[(( 2 ) << 2) + (  1 )]   = - Det3x3( a1, a3, a4, b1, b3, b4, d1, d3, d4);
	out[(( 3 ) << 2) + (  1 )]   =   Det3x3( a1, a3, a4, b1, b3, b4, c1, c3, c4);
  	out[(( 0 ) << 2) + (  2 )]   =   Det3x3( b1, b2, b4, c1, c2, c4, d1, d2, d4);
	out[(( 1 ) << 2) + (  2 )]   = - Det3x3( a1, a2, a4, c1, c2, c4, d1, d2, d4);
	out[(( 2 ) << 2) + (  2 )]   =   Det3x3( a1, a2, a4, b1, b2, b4, d1, d2, d4);
	out[(( 3 ) << 2) + (  2 )]   = - Det3x3( a1, a2, a4, b1, b2, b4, c1, c2, c4);
  	out[(( 0 ) << 2) + (  3 )]   = - Det3x3( b1, b2, b3, c1, c2, c3, d1, d2, d3);
	out[(( 1 ) << 2) + (  3 )]   =   Det3x3( a1, a2, a3, c1, c2, c3, d1, d2, d3);
	out[(( 2 ) << 2) + (  3 )]   = - Det3x3( a1, a2, a3, b1, b2, b3, d1, d2, d3);
	out[(( 3 ) << 2) + (  3 )]   =   Det3x3( a1, a2, a3, b1, b2, b3, c1, c2, c3);
	return *this;
}
  Matrix4& Matrix4::Invert()
{
	Matrix4 tmp;
	tmp.Assign(*this);
	Invert(tmp);
	return *this;
}
  Matrix4& Matrix4::Invert(const Matrix4& other)
{
	int i;
	Adjoint(other);
	float d = other.Det();
  	for (i = 0; i < 16; i++) M[i] = M[i] / d;
	return *this;
}
  float Matrix4::Det() const
{
	float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
	a1 = (M [(( 0 ) << 2) + (  0 )]) ;
	b1 = (M [(( 0 ) << 2) + (  1 )]) ; 
	c1 = (M [(( 0 ) << 2) + (  2 )]) ;
	d1 = (M [(( 0 ) << 2) + (  3 )]) ;
  	a2 = (M [(( 1 ) << 2) + (  0 )]) ;
	b2 = (M [(( 1 ) << 2) + (  1 )]) ; 
	c2 = (M [(( 1 ) << 2) + (  2 )]) ;
	d2 = (M [(( 1 ) << 2) + (  3 )]) ;
  	a3 = (M [(( 2 ) << 2) + (  0 )]) ;
	b3 = (M [(( 2 ) << 2) + (  1 )]) ; 
	c3 = (M [(( 2 ) << 2) + (  2 )]) ;
	d3 = (M [(( 2 ) << 2) + (  3 )]) ;
  	a4 = (M [(( 3 ) << 2) + (  0 )]) ;
	b4 = (M [(( 3 ) << 2) + (  1 )]) ; 
	c4 = (M [(( 3 ) << 2) + (  2 )]) ;
	d4 = (M [(( 3 ) << 2) + (  3 )]) ;
  	return  a1 * Det3x3( b2, b3, b4, c2, c3, c4, d2, d3, d4) -
			b1 * Det3x3( a2, a3, a4, c2, c3, c4, d2, d3, d4) +
			c1 * Det3x3( a2, a3, a4, b2, b3, b4, d2, d3, d4) -
			d1 * Det3x3( a2, a3, a4, b2, b3, b4, c2, c3, c4);
}
  Matrix4& Matrix4::SetProjection(float fov, float aspect, float znear, float zfar)
{
	float top = znear * TanD(fov);
	float bottom = -top;
	float left = bottom * aspect;
	float right = top * aspect;
	float x = (2.0f * znear) / (right - left);
	float y = (2.0f * znear) / (top - bottom);
	float a = (right + left) / (right - left);
	float b = (top + bottom) / (top - bottom);
	float c = -(zfar + znear) / (zfar - znear);
	float d = -(2.0f * zfar * znear) / (zfar - znear);
	M[0]  = x;     M[1]  = 0.0f;  M[2]  = 0.0f; M[3]  = 0.0f;
	M[4]  = 0.0f;  M[5]  = y;     M[6]  = 0.0f; M[7]  = 0.0f;
	M[8]  = a;     M[9]  = b;     M[10] = c;    M[11] = -1.0f;
	M[12] = 0.0f;  M[13] = 0.0f;  M[14] = d;    M[15] = 0.0f;
	return *this;
}
  Matrix4& Matrix4::SetOthogonal(float znear, float zfar)
{
	float x, y, z;
	float tx, ty, tz;
	float small = 0.0f;
	x = 2.0f / (1.0f + small);
	y = 2.0f / (1.0f + small);
	z = -2.0f / (zfar - znear);
	tx = -(1.0f - small) / (1.0f + small);
	ty = -(1.0f - small) / (1.0f + small);
	tz = -(zfar + znear) / (zfar - znear);
	M[0] = x;    M[4] = 0.0f;  M[8]  = 0.0f;  M[12] = tx;
	M[1] = 0.0f; M[5] = y;     M[9]  = 0.0f;  M[13] = ty;
	M[2] = 0.0f; M[6] = 0.0f;  M[10] = z;     M[14] = tz;
	M[3] = 0.0f; M[7] = 0.0f;  M[11] = 0.0f;  M[15] = 1.0f;
	return *this;
}
  float Matrix4::Det2x2(float a, float b, float c, float d)
{
  return a * d - b * c;
}
  
float Matrix4::Det3x3(float a1, float a2, float a3,
                   float b1, float b2, float b3,
                   float c1, float c2, float c3)
{
	return a1 * Det2x2(b2, b3, c2, c3)
		 - b1 * Det2x2(a2, a3, c2, c3)
		 + c1 * Det2x2(a2, a3, b2, b3);
}
  ostream& operator<<(ostream& os, Matrix4 &m)
{
	os << setprecision(4);
	os << "(" << m.M[0]  << ", " << m.M[1]  << ", " << m.M[2]  << ", " << m.M[3]  << ", " << endl
	   << " " << m.M[4]  << ", " << m.M[5]  << ", " << m.M[6]  << ", " << m.M[7]  << ", " << endl
	   << " " << m.M[8]  << ", " << m.M[9]  << ", " << m.M[10] << ", " << m.M[11] << ", " << endl
	   << " " << m.M[12] << ", " << m.M[13] << ", " << m.M[14] << ", " << m.M[15] << ")";
	return os;
}
  // ------------------------------------------------------------
// Quaternion
// ------------------------------------------------------------
void Quaternion::Slerp(const Quaternion& q0, const Quaternion& q1, float t)
{
	float cosom = q0.x * q1.x + q0.y * q1.y + q0.z * q1.z + q0.w * q1.w;
	float tmp0, tmp1, tmp2, tmp3;
	if (cosom < 0.0f)
	{
		cosom = -cosom;
		tmp0 = -q1.x;
		tmp1 = -q1.y;
		tmp2 = -q1.z;
		tmp3 = -q1.w;
	}
	else
	{
		tmp0 = q1.x;
		tmp1 = q1.y;
		tmp2 = q1.z;
		tmp3 = q1.w;
	}
  	/* calc coeffs */
	float scale0, scale1;
  	if ((1.0 - cosom) > 0.0000001f)
	{
		// standard case (slerp)
		float omega = (float) acos (cosom);
		float sinom = (float) sin (omega);
		scale0 = (float) sin ((1.0 - t) * omega) / sinom;
		scale1 = (float) sin (t * omega) / sinom;
	}
	else
	{
		/* just lerp */
		scale0 = 1.0f - t;
		scale1 = t;
	}
  	x = scale0 * q0.x + scale1 * tmp0;
	y = scale0 * q0.y + scale1 * tmp1;
	z = scale0 * q0.z + scale1 * tmp2;
	w = scale0 * q0.w + scale1 * tmp3;
}
  void Quaternion::Lerp(const Quaternion& q0, const Quaternion& q1, float t)
{
	float cosom = q0.x * q1.x + q0.y * q1.y + q0.z * q1.z + q0.w * q1.w;
	float tmp0, tmp1, tmp2, tmp3;
	if (cosom < 0.0f)
	{
		cosom = -cosom;
		tmp0 = -q1.x;
		tmp1 = -q1.y;
		tmp2 = -q1.z;
		tmp3 = -q1.w;
	}
	else
	{
		tmp0 = q1.x;
		tmp1 = q1.y;
		tmp2 = q1.z;
		tmp3 = q1.w;
	}
  	/* just lerp */
	float scale0 = 1.0f - t;
	float scale1 = t;
  	x = scale0 * q0.x + scale1 * tmp0;
	y = scale0 * q0.y + scale1 * tmp1;
	z = scale0 * q0.z + scale1 * tmp2;
	w = scale0 * q0.w + scale1 * tmp3;
}
  ostream& operator<<(ostream& os, Quaternion& v)
{
  os << "(" << setprecision(4) << v.x << ", "  << v.y << ", "  << v.z << ", "  << v.w << ")";
  return os;
}
   |  
  
 | 
 
  
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Mathematics.h] - (16,426 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
//
// Erm, all angles are in degree(like in OGL), I hate this
// fuckin' radians...
//
// Hmmm, some optimizations can be done, mostly in Matrix4,
// but for the first version I want working code, not 100%
// optimal one, tuning comes later...
//
// Currently some camera-stuff is missing in Matrix4, by
// the way, this comes later ... at the time I need it ;-)
// I think an higher level camera class may be better?!?
//
// should I include defines like #define FTYPE float
// and use this abstract type, so that it can also be used
// with doubles?????
//
// Hmmmmm, I think about making this all a template-library...
//
//
// Hakuna Matata, EvilOne
// Bite me... hehe
// ------------------------------------------------------------
#ifndef _mathematics_h_
#define _mathematics_h_
  #include <math.h>
#include <stdlib.h> 
#include <iostream.h>
#include <iomanip.h>
  // ------------------------------------------------------------
// constants
// ------------------------------------------------------------
// PI & Co.
const float M_PI				= 3.14159265358979323846f;
const float M_DEG_TO_RAD		= 0.01745329251994329547f;
const float M_RAD_TO_DEG		= 57.29577951308232286465f;
const float M_PI_DIV_2			= 1.570796326794896558f;
const float M_PI_DIV_4			= 0.785398163397448279f;
  // tolerance values
const float M_LOW_TOLERANCE		= 0.000001f;
const float M_TOLERANCE			= 0.000010f;
const float M_HIGH_TOLERANCE	= 0.000100f;
  // ------------------------------------------------------------
// basic functions
// ------------------------------------------------------------
inline float Clamp(float f, float min, float max)
{
	return min > f ? min : (max > f ? f : max);
}
  inline float Lerp(float f, float from, float to)
{
	return from + (to - from) * f;
}
  inline float Min(float f1, float f2)
{
	return f1 < f2 ? f1 : f2;
}
  inline float Max(float f1, float f2)
{
	return f1 > f2 ? f1 : f2;
}
  inline float SinD(float f)
{
	return (float)sin(f * M_DEG_TO_RAD);
}
  inline float CosD(float f)
{
	return (float)cos(f * M_DEG_TO_RAD);
}
  inline float TanD(float f)
{
	return (float)tan(f * M_DEG_TO_RAD);
}
  inline float AtanD(float f)
{
	return (float)atan(f * M_DEG_TO_RAD);
}
  inline float Degree(float f)
{
	return f * M_DEG_TO_RAD;
}
  inline float Radians(float f)
{
	return f * M_RAD_TO_DEG;
}
  inline bool IsZeroL(float f)
{
	return fabs(f) > M_LOW_TOLERANCE;
}
  inline bool IsZero(float f)
{
	return fabs(f) > M_TOLERANCE;
}
  inline bool IsZeroH(float f)
{
	return fabs(f) > M_HIGH_TOLERANCE;
}
  inline float Rand(float max)
{
	return (float(rand()) / float(RAND_MAX)) * max;
}
  inline float Rand(float min, float max)
{
	return Rand(max - min) + min; 
}
  // ------------------------------------------------------------
// Linear algebra classes
// ------------------------------------------------------------
class Vector2;
class Matrix3;
class Vector3;
class Plane;
class Matrix4;
class Quaternion;
  // ------------------------------------------------------------
// Vector2
// ------------------------------------------------------------
class Vector2
{
public:
  	// Members
	float x, y;
  public:
  	// Constructors
	Vector2();
	Vector2(const float* other);
	Vector2(float _x, float _y);
	Vector2(const Vector2& other);
  	// Assign
	Vector2& operator=(const Vector2& other);
	void Assign(float _x, float _y);
	void Assign(const Vector2& other);
	void Assign(float* other);
  	// Swap
	void Swap(Vector2& other);
  	// Casting
	operator float*();
	operator const float*() const;
  	// Math
	// this += other
	void Add(const Vector2& other);
	// this = v1 + v2
	void Add(const Vector2& v1, const Vector2& v2);
	// this -= other
	void Sub(const Vector2& other);
	// this = v1 - v2
	void Sub(const Vector2& v1, const Vector2& v2);
	// this *= f
	void Mul(float f);
	// this = other * f
	void Mul(const Vector2& other, float f);
	// this /= f
	void Div(float f);
	// this = other / f
	void Div(const Vector2& other, float f);
	// this = -this
	void Invert();
	// this = -other
	void Invert(const Vector2& other);
  	// Linear combination
	// this += other * s
	void Combine(const Vector2& other, float s);
	// this = this * s + other * t
	void Combine(float s, const Vector2& other, float t);
	// this = v1 * s + v2 * t
	void Combine(const Vector2& v1, float s, const Vector2& v2, float t);
  	// operators
	Vector2& operator+=(const Vector2& other);
	Vector2& operator-=(const Vector2& other);
	Vector2& operator*=(float f);
	Vector2& operator/=(float f);
	Vector2& operator+=(float f);
	Vector2& operator-=(float f);
	Vector2& operator-();
	Vector2 operator+(const Vector2& other) const;
	Vector2 operator-(const Vector2& other) const;
	Vector2 operator*(float f) const;
	Vector2 operator/(float f) const;
	Vector2 operator+(float f) const;
	Vector2 operator-(float f) const;
  	// Linear Algebra
	float Length() const;
	float LengthSqr() const;
	float Distance(const Vector2& other) const;
	float DistanceSqr(const Vector2& other) const;
	void Normalize();
	void Normalize(const Vector2& other);
  	void Rotate(float angle);
	void Rotate(Vector2 other, float angle);
  	// Others
	void Clamp(float min, float max);
	// this = v1 + (v2 - v1) * s
	void Lerp(const Vector2& v1, const Vector2& v2, float s);
  	// Actions with Matrix3
	void Transform(const Matrix3& mat, const Vector2& other);
	void Transform(const Matrix3& mat);
  	// friend operators
	friend ostream& operator<<(ostream& os, Vector2& v);
};
  // ------------------------------------------------------------
// Matrix3
// ------------------------------------------------------------
class Matrix3
{
public:
  	// members
	union
	{
		float M[9];
		float m[3][3];
	};
  	static float Identity_Matrix[];
  public:
  	// Constructors
	Matrix3();
	Matrix3(const float* other);
	Matrix3(const Matrix3& other);
  	// Assignment
	Matrix3& operator=(const Matrix3& other);
	void Assign(const float* other);
	void Assign(const Matrix3& other);
  	// Casting
	operator float*();
	operator const float*() const;
  	// Simple methods
	Matrix3& SetIdentity();
	Matrix3& SetZero();
  	// this *= other
	Matrix3& Mul(const Matrix3& other);
	// this = m1 * m2
	Matrix3& Mul(const Matrix3& m1, const Matrix3& m2);
	// this *= f
	Matrix3& Mul(float f);
	// this = other * f
	Matrix3& Mul(const Matrix3& other, float f);
	// this /= f
	Matrix3& Div(float f);
	// this = other / f
	Matrix3& Div(const Matrix3& other, float f);
  	// Operators
	Matrix3& operator*=(const Matrix3& other);
	Matrix3 operator*(const Matrix3& other) const;
  	// Transformation methods
	Matrix3& Translate(float tx, float ty);
	Matrix3& SetTranslate(float tx, float ty);
	Matrix3& Rotate(float r);
	Matrix3& SetRotate(float r);
	Matrix3& Scale(float sx, float sy);
	Matrix3& SetScale(float sx, float sy);
  	// friends
	friend ostream& operator<<(ostream& os, Matrix3 &m);
};
  // ------------------------------------------------------------
// Vector3
// ------------------------------------------------------------
class Vector3
{
public:
  	// Member variables
	float x, y, z;
  public:
  	// Constructors
	Vector3();
	Vector3(float _x, float _y, float _z);
	Vector3(Vector3& other);
	Vector3(const float* other);
  	// assignemt
	Vector3& operator=(const Vector3& other);
	void Assign(float _x, float _y, float _z);
	void Assign(const Vector3& other);
	void Assign(float* other);
  	// Swap
	void Swap(Vector3& other);
  	// Casting
	operator float*();
	operator const float*() const;
  	// Math
	// this += other
	void Add(const Vector3& other);
	// this = v1 + v2
	void Add(const Vector3& v1, const Vector3& v2);
	// this -= other
	void Sub(const Vector3& other);
	// this = v1 - v2
	void Sub(const Vector3& v1, const Vector3& v2);
	// this *= f
	void Mul(float f);
	// this = other * f
	void Mul(const Vector3& other, float f);
	// this /= f
	void Div(float f);
	// this = other / f
	void Div(const Vector3& other, float f);
	// this = -this
	void Invert();
	// this = -other
	void Invert(const Vector3& other);
  	// Linear combination
	// this += other * s
	void Combine(const Vector3& other, float s);
	// this = this * s + other * t
	void Combine(float s, const Vector3& other, float t);
	// this = v1 * s + v2 * t
	void Combine(const Vector3& v1, float s, const Vector3& v2, float t);
  	// EvilOne's beloved overloads
	Vector3& operator+=(const Vector3& other);
	Vector3& operator-=(const Vector3& other);
	Vector3& operator*=(float f);
	Vector3& operator/=(float f);
	Vector3& operator+=(float f);
	Vector3& operator-=(float f);
	Vector3& operator-();
	Vector3 operator+(const Vector3& other) const;
	Vector3 operator-(const Vector3& other) const;
	Vector3 operator*(float f) const;
	Vector3 operator/(float f) const;
	Vector3 operator+(float f) const;
	Vector3 operator-(float f) const;
  	// Linear Algebra
	float Dot(const Vector3& v) const;
	// this = v1 x v2
	void Cross(const Vector3& v);
	void Cross(const Vector3& v1, const Vector3& v2);
	float Length() const;
	float LengthSqr() const;
	float Distance(const Vector3& other) const;
	float DistanceSqr(const Vector3& other) const;
	void Normalize();
	void Normalize(const Vector3& other);
  	// Other usefull funtions
	void Clamp(float min, float max);
	// this = v1 + (v2 - v1) * s
	void Lerp(const Vector3& v1, const Vector3& v2, float s);
  	// Operations with a plane
	void Intersect(const Vector3& start, float s, const Vector3& end, float e);
	void Intersect(const Plane& p, const Vector3& start, const Vector3& end);
	void Reflect(const Plane& p, const Vector3& v);
  	// Operations with Matrix
	void Transform(const Matrix4& mat, const Vector3& other);
	void Transform(const Matrix4& mat);
	void TransformTranspose(const Matrix4& mat, const Vector3& other);
	void TransformTranspose(const Matrix4& mat);
  	// friend operators
	friend ostream& operator<<(ostream& os, Vector3& v);
};
  // ------------------------------------------------------------
// Plane
// ------------------------------------------------------------
class Plane
{
public:
  	// members 
	union
	{
		struct
		{
			float a, b, c, d;
		};
  		struct
		{
			Vector3 n;
			float d;
		};
	};
  public:
  	// Constructors
	Plane();
	Plane(const Vector3& _n, float _d);
	Plane(float _a, float _b, float _c, float _d);
	Plane(float* other);
	Plane(const Plane& other);
  	// Assignment
	Plane& operator=(const Plane& other);
	void Assign(const Vector3& _n, float _d);
	void Assign(float _a, float _b, float _c, float _d);
	void Assign(float* other);
	void Assign(const Plane& other);
  	// Functions
	float Distance(const Vector3& v) const;
  	// Interaction with matrix
	void Transform(const Matrix4 &mat);
	void Transform(const Matrix4 &mat, const Plane& other);
  	// friend operators
	friend ostream& operator<<(ostream& os, Plane& p);
};
  // ------------------------------------------------------------
// Matrix4
// ------------------------------------------------------------
class Matrix4
{
public:
  	// members
	union
	{
		float M[16];
		float m[4][4];
	};
  	static float Identity_Matrix[];
	static float Orientation_Switch_Matrix[];
	static float Perspective_Matrix[];
  public:
  	// Constructors
	Matrix4();
	Matrix4(const float* other);
	Matrix4(const Matrix4& other);
	Matrix4(const Quaternion& other);
  	// Assignment
	Matrix4& operator=(const Matrix4& other);
	Matrix4& operator=(const Quaternion& other);
	void Assign(const Quaternion& other);
	void Assign(const float* other);
	void Assign(const Matrix4& other);
  	// Casting
	operator float*();
	operator const float*() const;
  	// Simple methods
	Matrix4& SetIdentity();
	Matrix4& SetZero();
	Matrix4& SetPerspective();
	Matrix4& SetSwitchOrientation();
  	// this *= other
	Matrix4& Mul(const Matrix4& other);
	// this = m1 * m2
	Matrix4& Mul(const Matrix4& m1, const Matrix4& m2);
	// this *= f
	Matrix4& Mul(float f);
	// this = other * f
	Matrix4& Mul(const Matrix4& other, float f);
	// this /= f
	Matrix4& Div(float f);
	// this = other / f
	Matrix4& Div(const Matrix4& other, float f);
  	// Operators
	Matrix4& operator*=(const Matrix4& other);
	Matrix4 operator*(const Matrix4& other) const;
  	// Transformation methods
	Matrix4& SetTranslate(float tx, float ty, float tz);
	Matrix4& Translate(float tx, float ty, float tz);
	Matrix4& SetScale(float sx, float sy, float sz);
	Matrix4& Scale(float sx, float sy, float sz);
  	// rotation around three euler-angles
	Matrix4& SetRotate(const Vector3& r);
	Matrix4& SetRotate(float rx, float ry, float rz);
	Matrix4& Rotate(const Vector3& r);
	Matrix4& Rotate(float rx, float ry, float rz);
  	// rotation euler-angle around axis
	
	Matrix4& SetRotate(float angle, const Vector3& r);
	Matrix4& SetRotate(float angle, float x, float y, float z);
	Matrix4& Rotate(float angle, const Vector3& r);
	Matrix4& Rotate(float angle, float x, float y, float z);
  	// Invert/Transpose
	Matrix4& Adjoint();
	Matrix4& Adjoint(const Matrix4& other);
  	Matrix4& Transpose();
	Matrix4& Transpose(const Matrix4& other);
  	Matrix4& Invert();
	Matrix4& Invert(const Matrix4& other);
  	float Det() const;
  	// Perpsective
	Matrix4& SetProjection(float fov, float aspect, float znear, float zfar);
	Matrix4& SetOthogonal(float znear, float zfar);
  	// static
	static float Det2x2(float a, float b, float c, float d);
	static float Det3x3(float a1, float a2, float a3,
						float b1, float b2, float b3,
						float c1, float c2, float c3);
  	// friends
	friend ostream& operator<<(ostream& os, Matrix4 &m);
};
  // ------------------------------------------------------------
// Quaternion
// ------------------------------------------------------------
class Quaternion
{
public:
  	// Members
	float x, y, z, w;
  public:
  	// Constructors
	Quaternion();
	Quaternion(const Quaternion& other);
	Quaternion(const float* other);
	Quaternion(float _x, float _y, float _z, float _w);
  	// Assignment
	Quaternion& operator=(const Quaternion& other);
	void Assign(const Quaternion& other);
	void Assign(const float* other);
	void Assign(float _x, float _y, float _z, float _w);
  	// Simple math
	void Invert();
	void Invert(const Quaternion& other);
	Quaternion& operator-();
  	Quaternion& Mul(const Quaternion& other);
	Quaternion& Mul(const Quaternion& q1, const Quaternion& q2);
	Quaternion operator*(const Quaternion& other) const;
	Quaternion& operator*=(const Quaternion& other);
  	float Length() const;
	float LengthSqr() const;
  	void Normalize();
	void Normalize(const Quaternion& other);
  	// Rotation around euler-angle and axis
	Quaternion& SetRotate(float angle, const Vector3& v);
	Quaternion& Rotate(float angle, const Vector3& v);
	Quaternion& SetRotate(float angle, float _x, float _y, float _z);
	Quaternion& Rotate(float angle, float _x, float _y, float _z);
  	// rotation around three euler-angles
	Quaternion& SetRotate(const Vector3& v);
	Quaternion& Rotate(const Vector3& v);
	Quaternion& SetRotate(float rx, float ry, float rz);
	Quaternion& Rotate(float rx, float ry, float rz);
  	// Interpolation
	void Lerp(const Quaternion& q0, const Quaternion& q1, float t);
	void Slerp(const Quaternion& q0, const Quaternion& q1, float t);
  	// friend operators
	friend ostream& operator<<(ostream& os, Quaternion& v);
};
  // ------------------------------------------------------------
// Include implementations
// ------------------------------------------------------------
#include "Vector2.h"
#include "Matrix3.h"
#include "Vector3.h"
#include "Plane.h"
#include "Matrix4.h"
#include "Quaternion.h"
  #endif
   |  
  
 | 
 
  
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Matrix3.h] - (3,761 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
// Constructors
inline Matrix3::Matrix3()
{}
  inline Matrix3::Matrix3(const float* other)
{
	for(int i = 0; i < 9; i++) M[i] = other[i];
}
  inline Matrix3::Matrix3(const Matrix3& other)
{
	for(int i = 0; i < 9; i++) M[i] = other.M[i];
}
  // Assignment
inline Matrix3& Matrix3::operator=(const Matrix3& other)
{
	for(int i = 0; i < 9; i++) M[i] = other.M[i];
	return *this;
}
  inline void Matrix3::Assign(const Matrix3& other)
{
	for(int i = 0; i < 9; i++) M[i] = other.M[i];
}
  inline void Matrix3::Assign(const float* other)
{
	for(int i = 0; i < 9; i++) M[i] = other[i];
}
  // Casting
inline Matrix3::operator const float*() const
{
	return M;
}
  inline Matrix3::operator float*()
{
	return M;
}
  // Simple Methods
inline Matrix3& Matrix3::SetIdentity()
{
	for(int i = 0; i < 9; i++) M[i] = Matrix3::Identity_Matrix[i];
	return *this;
}
  inline Matrix3& Matrix3::SetZero()
{
	for(int i = 0; i < 9; i++) M[i] = 0.0f;
	return *this;
}
  inline Matrix3& Matrix3::Mul(const Matrix3& other)
{
	Matrix3 tmp;
	tmp.Assign(*this);
	Mul(tmp, other);
	return *this;
}
  inline Matrix3& Matrix3::Mul(const Matrix3& m1, const Matrix3& m2)
{
	const float *b = m1.M;
	const float *a = m2.M;
	float *prod = M;
  	for(int i = 0; i < 3; i++)
	{
		float a0 = a[i];
		float a1 = a[i + 3];
		float a2 = a[i + 6];
		prod[i]     = a0 * b[0] + a1 * b[1] + a2 * b[2];
		prod[i + 3] = a0 * b[3] + a1 * b[4] + a2 * b[5];
		prod[i + 6] = a0 * b[6] + a1 * b[7] + a2 * b[8];
	}
	return *this;
}
  inline Matrix3& Matrix3::Mul(float f)
{
	for(int i = 0; i < 9; i++) M[i] *=f;
	return *this;
}
  inline Matrix3& Matrix3::Mul(const Matrix3& other, float f)
{
	const float* m = other.M;
	for(int i = 0; i < 9; i++) M[i] = m[i] * f;
	return *this;
}
  inline Matrix3& Matrix3::Div(float f)
{
	f = 1.0f / f;
	for(int i = 0; i < 9; i++) M[i] *=f;
	return *this;
}
  inline Matrix3& Matrix3::Div(const Matrix3& other, float f)
{
	f = 1.0f / f;
	const float* m = other.M;
	for(int i = 0; i < 9; i++) M[i] = m[i] * f;
	return *this;
}
  // Operators
inline Matrix3& Matrix3::operator*=(const Matrix3& other)
{
	Matrix3 tmp;
	tmp.Assign(*this);
	Mul(tmp, other);
	return *this;
}
  inline Matrix3 Matrix3::operator*(const Matrix3& other) const
{
	Matrix3 tmp;
	tmp.Mul(*this, other);
	return tmp;
}
  // Transformations
inline Matrix3& Matrix3::Translate(float tx, float ty)
{
	M[6] = M[0] * tx + M[3] * ty + M[6];
	M[7] = M[1] * tx + M[4] * ty + M[7];
	M[8] = M[2] * tx + M[5] * ty + M[8];
	return *this;
}
  inline Matrix3& Matrix3::SetTranslate(float tx, float ty)
{
	SetIdentity();
	M[6] = tx;
	M[7] = ty;
	return *this;
}
  inline Matrix3& Matrix3::Scale(float sx, float sy)
{
	M[0] *= sx; M[3] *= sy;
	M[1] *= sx; M[4] *= sy;
	M[2] *= sx; M[5] *= sy;
	return *this;
}
  inline Matrix3& Matrix3::SetScale(float sx, float sy)
{
	M[0] = sx; M[4] = sy; M[8] = 1.0f;
	M[1] = M[2] = M[3] = M[5] = M[6] = M[7] = 0.0f;
	return *this;
}
  inline Matrix3& Matrix3::Rotate(float r)
{
	float c = CosD(r), s = SinD(r);
	Matrix3 tmp;
	tmp.SetIdentity();
	tmp.M[0] = c;
	tmp.M[1] = -s;
	tmp.M[3] = s;
	tmp.M[4] = c;
	Mul(tmp);
	return *this;
}
  inline Matrix3& Matrix3::SetRotate(float r)
{
	float c = CosD(r), s = SinD(r);
	Matrix3 tmp;
	SetIdentity();
	M[0] = c;
	M[1] = -s;
	M[3] = s;
	M[4] = c;
	return *this;
}
  |  
  
 | 
 
  
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Matrix4.h] - (4,934 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
#ifndef _mathematics_h_
#error "Dont include Matrix4 directly!!! Use Mathematics.h instead."
#endif
  // Constructors
inline Matrix4::Matrix4()
{}
  inline Matrix4::Matrix4(const Matrix4& other)
{
	for(int i = 0; i < 16; i++) M[i] = other.M[i];
}
  inline Matrix4::Matrix4(const float* other)
{
	for(int i = 0; i < 16; i++) M[i] = other[i];
}
  inline Matrix4::Matrix4(const Quaternion& other)
{
	Assign(other);
}
  // Assignment
inline Matrix4& Matrix4::operator=(const Matrix4& other)
{
	for(int i = 0; i < 16; i++) M[i] = other.M[i];
	return *this;
}
  inline void Matrix4::Assign(const Matrix4& other)
{
	for(int i = 0; i < 16; i++) M[i] = other.M[i];
}
  inline void Matrix4::Assign(const float* other)
{
	for(int i = 0; i < 16; i++) M[i] = other[i];
}
  inline Matrix4& Matrix4::operator=(const Quaternion& other)
{
	Assign(other);
	return *this;
}
  // Casting
inline Matrix4::operator const float*() const
{
	return M;
}
  inline Matrix4::operator float*()
{
	return M;
}
  // Simple methods
inline Matrix4& Matrix4::SetIdentity()
{
	for(int i = 0; i < 16; i++) M[i] = Matrix4::Identity_Matrix[i];
	return *this;
}
  inline Matrix4& Matrix4::SetZero()
{
	for(int i = 0; i < 16; i++) M[i] = 0.0f;
	return *this;
}
  inline Matrix4& Matrix4::SetSwitchOrientation()
{
	for(int i = 0; i < 16; i++) M[i] = Matrix4::Orientation_Switch_Matrix[i];
	return *this;
}
  inline Matrix4& Matrix4::SetPerspective()
{
	for(int i = 0; i < 16; i++) M[i] = Matrix4::Perspective_Matrix[i];
	return *this;
}
  inline Matrix4& Matrix4::Mul(const Matrix4& other)
{
	Matrix4 tmp;
	tmp.Assign(*this);
	Mul(tmp, other);
	return *this;
}
  inline Matrix4& Matrix4::Mul(const Matrix4& m1, const Matrix4& m2)
{
	const float *b = m1.M;
	const float *a = m2.M;
	float *prod = M;
  	for(int i = 0; i < 4; i++)
	{
		float a0 = a[i];
		float a1 = a[i + 4];
		float a2 = a[i + 8];
		float a3 = a[i + 12];
		prod[i] = a0 * b[0] + a1 * b[1] + a2 * b[2] + a3 * b[3];
		prod[i + 4] = a0 * b[4] + a1 * b[5] + a2 * b[6] + a3 * b[7];
		prod[i + 8] = a0 * b[8] + a1 * b[9] + a2 * b[10] + a3 * b[11];
		prod[i + 12] = a0 * b[12] + a1 * b[13] + a2 * b[14] + a3 * b[15];
	}
	return *this;
}
  inline Matrix4& Matrix4::Mul(float f)
{
	for(int i = 0; i < 16; i++) M[i] *=f;
	return *this;
}
  inline Matrix4& Matrix4::Mul(const Matrix4& other, float f)
{
	const float* m = other.M;
	for(int i = 0; i < 16; i++) M[i] = m[i] * f;
	return *this;
}
  inline Matrix4& Matrix4::Div(float f)
{
	f = 1.0f / f;
	for(int i = 0; i < 16; i++) M[i] *=f;
	return *this;
}
  inline Matrix4& Matrix4::Div(const Matrix4& other, float f)
{
	f = 1.0f / f;
	const float* m = other.M;
	for(int i = 0; i < 16; i++) M[i] = m[i] * f;
	return *this;
}
  // Operators
inline Matrix4& Matrix4::operator*=(const Matrix4& other)
{
	Matrix4 tmp;
	tmp.Assign(*this);
	Mul(tmp, other);
	return *this;
}
  inline Matrix4 Matrix4::operator*(const Matrix4& other) const
{
	Matrix4 tmp;
	tmp.Mul(*this, other);
	return tmp;
}
  // Transformation
inline Matrix4& Matrix4::Translate(float tx, float ty, float tz)
{
	M[12] = M[0] * tx + M[4] * ty + M[8]  * tz + M[12];
	M[13] = M[1] * tx + M[5] * ty + M[9]  * tz + M[13];
	M[14] = M[2] * tx + M[6] * ty + M[10] * tz + M[14];
	M[15] = M[3] * tx + M[7] * ty + M[11] * tz + M[15];
	return *this;
}
  inline Matrix4& Matrix4::SetTranslate(float tx, float ty, float tz)
{
	SetIdentity();
	return Translate(tx, ty, tz);
}
  inline Matrix4& Matrix4::Scale(float sx, float sy, float sz)
{
	M[0] *= sx; M[4] *= sy; M[8]  *= sz;
	M[1] *= sx; M[5] *= sy; M[9]  *= sz;
	M[2] *= sx; M[6] *= sy; M[10] *= sz;
	M[3] *= sx; M[7] *= sy; M[11] *= sz;
	return *this;
}
  inline Matrix4& Matrix4::SetScale(float sx, float sy, float sz)
{
	SetIdentity();
	return Scale(sx, sy, sz);
}
  inline Matrix4& Matrix4::Rotate(float rx, float ry, float rz)
{
	Matrix4 tmp;
	tmp.SetRotate(rx, ry, rz);
	Mul(tmp);
	return *this;
}
  inline Matrix4& Matrix4::Rotate(float angle, float x, float y, float z)
{
	Matrix4 tmp;
	tmp.SetRotate(angle, x, y, z);
	Mul(tmp);
	return *this;
}
  inline Matrix4& Matrix4::SetRotate(const Vector3& r)
{
	return SetRotate(r.x, r.y, r.z);
}
  inline Matrix4& Matrix4::Rotate(const Vector3& r)
{
	return Rotate(r.x, r.y, r.z);
}
  inline Matrix4& Matrix4::SetRotate(float angle, const Vector3& r)
{
	return SetRotate(angle, r.x, r.y, r.z);
}
  inline Matrix4& Matrix4::Rotate(float angle, const Vector3& r)
{
	return Rotate(angle, r.x, r.y, r.z);
}
   |  
  
 | 
 
  
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Plane.h] - (2,376 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
#ifndef _mathematics_h_
#error "Dont include Plane directly!!! Use Mathematics.h instead."
#endif
  inline Plane::Plane()
{}
  // copy by hand avoids call to Vector3::operator=(...)
inline Plane::Plane(const Vector3& _n, float _d)
{
	a = _n.x; b = _n.y; c = _n.z; d = _d;
}
  inline Plane::Plane(float _a, float _b, float _c, float _d)
{
	a = _a; b = _b; c = _c; d = _d;
}
  inline Plane::Plane(float* other)
{
	a = other[0]; b = other[1]; c = other[2]; d = other[3];
}
  inline Plane::Plane(const Plane& other)
{
	a = other.a; b = other.b; c = other.c; d = other.d;
}
  // Assignment
inline Plane& Plane::operator=(const Plane& other)
{
	a = other.a; b = other.b; c = other.c; d = other.d;
	return *this;
}
  inline void Plane::Assign(const Vector3& _n, float _d)
{
	a = _n.x; b = _n.y; c = _n.z; d = _d;
}
  inline void Plane::Assign(float _a, float _b, float _c, float _d)
{
	a = _a; b = _b; c = _c; d = _d;
}
  inline void Plane::Assign(float* other)
{
	a = other[0]; b = other[1]; c = other[2]; d = other[3];
}
  inline void Plane::Assign(const Plane& other)
{
	a = other.a; b = other.b; c = other.c; d = other.d;
}
  // Functions
inline float Plane::Distance(const Vector3& v) const
{
	return n.Dot(v) - d;
}
  inline void Plane::Transform(const Matrix4& mat)
{
  const float* m = mat.M;
  float fx = a;
  float fy = b;
  float fz = c;
  float fw = d;
  a = m[0] * fx + m[4] * fy + m[8] * fz + m[12] * fw;
  b = m[1] * fx + m[5] * fy + m[9] * fz + m[13] * fw;
  c = m[2] * fx + m[6] * fy + m[10] * fz + m[14] * fw;
  d = m[3] * fx + m[7] * fy + m[11] * fz + m[15] * fw;
}
  inline void Plane::Transform(const Matrix4& mat, const Plane& other)
{
  const float* m = mat.M;
  float fx = other.a;
  float fy = other.b;
  float fz = other.c;
  float fw = other.d;
  a = m[0] * fx + m[4] * fy + m[8] * fz + m[12] * fw;
  b = m[1] * fx + m[5] * fy + m[9] * fz + m[13] * fw;
  c = m[2] * fx + m[6] * fy + m[10] * fz + m[14] * fw;
  d = m[3] * fx + m[7] * fy + m[11] * fz + m[15] * fw;
}
   |  
  
 | 
 
  
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Quaternion.h] - (4,190 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
#ifndef _mathematics_h_
#error "Dont include Quaternion directly!!! Use Mathematics.h instead."
#endif
  // Constructors
inline Quaternion::Quaternion()
{}
  inline Quaternion::Quaternion(const Quaternion& other)
{
	x = other.x; y = other.y; z = other.z; w = other.w;
}
  inline Quaternion::Quaternion(const float* other)
{
	x = other[0]; y = other[1]; z = other[2]; w = other[3];
}
  inline Quaternion::Quaternion(float _x, float _y, float _z, float _w)
{
	x = _x; y = _y; z = _z; w = _w;
}
  // Assignment
inline Quaternion& Quaternion::operator=(const Quaternion& other)
{
	x = other.x; y = other.y; z = other.z; w = other.w;
	return *this;
}
  inline void Quaternion::Assign(const Quaternion& other)
{
	x = other.x; y = other.y; z = other.z; w = other.w;
}
  inline void Quaternion::Assign(const float* other)
{
	x = other[0]; y = other[1]; z = other[2]; w = other[3];
}
  inline void Quaternion::Assign(float _x, float _y, float _z, float _w)
{
	x = _x; y = _y; z = _z; w = _w;
}
  // Simple math
inline void Quaternion::Invert()
{
	x = -x; y = -y; z = -z;
}
  inline void Quaternion::Invert(const Quaternion& other)
{
	x = -other.x; y = -other.y; z = -other.z;
	w = other.w;
}
  inline Quaternion& Quaternion::operator-()
{
	x = -x; y = -y; z = -z;
	return *this;
}
  inline float Quaternion::Length() const
{
	return (float)sqrt(w*w + x*x + y*y + z*z);
}
  inline float Quaternion::LengthSqr() const
{
	return w*w + x*x + y*y + z*z;
}
  inline void Quaternion::Normalize()
{
	float f = 1.0f / (w*w + x*x + y*y + z*z);
	x *= f; y *= f; z *= f; w *= f;
}
  inline void Quaternion::Normalize(const Quaternion& other)
{
	float f = 1.0f / other.Length();
	x = other.x * f; y = other.y * f; z = other.z * f; w = other.w * f;
}
  inline Quaternion& Quaternion::Mul(const Quaternion& other)
{
	Mul(*this, other);
	return *this;
}
  inline Quaternion& Quaternion::Mul(const Quaternion& q1, const Quaternion& q2)
{
	const Vector3 v1 = &q1.x;
	const Vector3 v2 = &q2.x;
      float scalar = q1.w * q2.w - v1.Dot(v2);
      Vector3 va; va.Cross(v1, v2);
	Vector3 vb; vb.Mul(v1, q2.w);
	Vector3 vc; vc.Mul(v2, q1.w);
	va.Add(vb); va.Add(vc);
  	x = va.x; y = va.y; z = va.z; w = scalar;
      Normalize();
	return *this;
}
  inline Quaternion Quaternion::operator*(const Quaternion& other) const
{
	Quaternion tmp;
	tmp.Mul(*this, other);
	return tmp;
}
  inline Quaternion& Quaternion::operator*=(const Quaternion& other)
{
	Mul(*this, other);
	return *this;
}
  // Rotation
inline Quaternion& Quaternion::SetRotate(float angle, const Vector3& v)
{
	return SetRotate(angle, v.x, v.y, v.z);
}
  inline Quaternion& Quaternion::Rotate(float angle, const Vector3& v)
{
	return Rotate(angle, v.x, v.y, v.z);
}
  inline Quaternion& Quaternion::SetRotate(const Vector3& v)
{
	return SetRotate(v.x, v.y, v.z);
}
  inline Quaternion& Quaternion::Rotate(const Vector3& v)
{
	return Rotate(v.x, v.y, v.z);
}
  inline Quaternion& Quaternion::SetRotate(float angle, float _x, float _y, float _z)
{
    float s = SinD(angle / 2.0f);
    float c = CosD(angle / 2.0f);
      x = _x * s;
    y = _y * s;
    z = _z * s;
    w = c;
	Normalize();
	return *this;
}
  inline Quaternion& Quaternion::Rotate(float angle, float _x, float _y, float _z)
{
	Quaternion tmp;
	tmp.SetRotate(angle, _x, _y, _z);
	Mul(*this, tmp);
	return *this;
}
  inline Quaternion& Quaternion::SetRotate(float rx, float ry, float rz)
{
	Quaternion qy, qz;
	SetRotate(rx, 1.0f, 0.0f, 0.0f);
	qy.SetRotate(ry, 0.0f, 1.0f, 0.0f);
	qz.SetRotate(rz, 0.0f, 0.0f, 1.0f);
	Mul(*this, qy);
	Mul(*this, qz);
	return *this;
}
  inline Quaternion& Quaternion::Rotate(float rx, float ry, float rz)
{
	Quaternion tmp;
	tmp.SetRotate(rx, ry, rz);
	Mul(*this, tmp);
	return *this;
}
   |  
  
 | 
 
  
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Vector2.h] - (5,669 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
#ifndef _mathematics_h_
#error "Dont include Vector2 directly!!! Use Mathematics.h instead."
#endif
  // Constructors
inline Vector2::Vector2()
{}
  inline Vector2::Vector2(const float* other)
{
	x = other[0]; y = other[1];
}
  inline Vector2::Vector2(float _x, float _y)
{
	x = _x; y = _y;
}
  inline Vector2::Vector2(const Vector2& other)
{
	x = other.x; y = other.y;
}
  // Assign
inline Vector2& Vector2::operator=(const Vector2& other)
{
	x = other.x; y = other.y;
	return *this;
}
  inline void Vector2::Assign(float _x, float _y)
{
	x = _x; y = _y;
}
  
inline void Vector2::Assign(const Vector2& other)
{
	x = other.x; y = other.y;
}
  inline void Vector2::Assign(float* other)
{
	x = other[0]; y = other[1];
}
  // Swap
inline void Vector2::Swap(Vector2& other)
{
	Vector2 tmp = *this;
	Assign(other);
	other.Assign(tmp);
}
  // Casting
inline Vector2::operator float*()
{
	return &x;
}
  inline Vector2::operator const float*() const
{
	return &x;
}
  // Math
inline void Vector2::Add(const Vector2& other)
{
	x += other.x; y += other.y;
}
  inline void Vector2::Add(const Vector2& v1, const Vector2& v2)
{
	x = v1.x + v2.x; y = v1.y + v2.y;
}
  inline void Vector2::Sub(const Vector2& other)
{
	x -= other.x; y -= other.y;
}
  inline void Vector2::Sub(const Vector2& v1, const Vector2& v2)
{
	x = v1.x - v2.x; y = v1.y - v2.y;
}
  inline void Vector2::Mul(float f)
{
	x *= f; y *= f;
}
  inline void Vector2::Mul(const Vector2& other, float f)
{
	x = other.x * f; y = other.y * f;
}
  inline void Vector2::Div(float f)
{
	f = 1.0f / f;
	x *= f; y *= f;
}
  inline void Vector2::Div(const Vector2& other, float f)
{
	f = 1.0f / f;
	x = other.x * f; y = other.y * f;
}
  inline void Vector2::Invert()
{
	x = -x; x = -y;
}
  inline void Vector2::Invert(const Vector2& other)
{
	x = -other.x; x = -other.y;
}
  // Linear combination
inline void Vector2::Combine(const Vector2& other, float s)
{
	x += other.x * s; y += other.y * s;
}
  inline void Vector2::Combine(float s, const Vector2& other, float t)
{
	x = x * s + other.x * t; y = y * s + other.y * t;
}
  inline void Vector2::Combine(const Vector2& v1, float s, const Vector2& v2, float t)
{
	x = v1.x * s + v2.x * t; y = v1.y * s + v2.y * t;
}
  // operators
inline Vector2& Vector2::operator+=(const Vector2& other)
{
	x += other.x; y += other.y;
	return *this;
}
  inline Vector2& Vector2::operator-=(const Vector2& other)
{
	x -= other.x; y -= other.y;
	return *this;
}
  inline Vector2& Vector2::operator*=(float f)
{
	x *= f; y *= f;
	return *this;
}
  inline Vector2& Vector2::operator-=(float f)
{
	x -= f; y -= f;
	return *this;
}
  inline Vector2& Vector2::operator+=(float f)
{
	x += f; y += f;
	return *this;
}
  inline Vector2& Vector2::operator/=(float f)
{
	f = 1.0f / f;
	x *= f; y *= f;
	return *this;
}
  inline Vector2& Vector2::operator-()
{
	x = -x; y = -y;
	return *this;
}
  inline Vector2 Vector2::operator+(const Vector2& other) const
{
	return Vector2(x + other.x, y + other.y);
}
  inline Vector2 Vector2::operator-(const Vector2& other) const
{
	return Vector2(x - other.x, y - other.y);
}
  inline Vector2 Vector2::operator+(float f) const
{
	return Vector2(x + f, y + f);
}
  inline Vector2 Vector2::operator-(float f) const
{
	return Vector2(x - f, y - f);
}
  inline Vector2 Vector2::operator*(float f) const
{
	return Vector2(x * f, y * f);
}
  inline Vector2 Vector2::operator/(float f) const
{
	f = 1.0f / f;
	return Vector2(x * f, y * f);
}
  // Linear algebra
inline float Vector2::Length() const
{
	return (float)sqrt(x * x + y * y);
}
  inline float Vector2::LengthSqr() const
{
	return x * x + y * y;
}
  inline float Vector2::Distance(const Vector2& other) const
{
	Vector2 tmp = other - *this;
	return tmp.Length();
}
  inline float Vector2::DistanceSqr(const Vector2& other) const
{
	Vector2 tmp = other - *this;
	return tmp.LengthSqr();
}
  inline void Vector2::Normalize()
{
	float f = 1.0f / Length();
	x = x * f; y = y * f;
}
  inline void Vector2::Normalize(const Vector2& other)
{
	float f = 1.0f / other.Length();
	x = other.x * f; y = other.y * f;
}
  inline void Vector2::Rotate(float angle)
{
	float _x = x;
	x =  _x * CosD(angle) + y * SinD(angle);
	y = -_x * SinD(angle) + y * CosD(angle);
}
  inline void Vector2::Rotate(Vector2 other, float angle)
{
	float _x = other.x;
	float _y = other.y;
  	x =  _x * CosD(angle) + _y * SinD(angle);
	y = -_x * SinD(angle) + _y * CosD(angle);
}
  // Others
inline void Vector2::Clamp(float min, float max)
{
	x = ::Clamp(x, min, max); y = ::Clamp(y, min, max);
}
  inline void Vector2::Lerp(const Vector2& v1, const Vector2& v2, float s)
{
	x = ::Lerp(s, v1.x, v2.x); y = ::Lerp(s, v1.y, v2.y);
}
  inline void Vector2::Transform(const Matrix3& mat, const Vector2& other)
{
	const float* m = mat.M;
	float fx = other.x; float fy = other.y;
	x = m[0] * fx + m[3] * fy + m[6];  // w assumed to be 1.0F
	y = m[1] * fx + m[4] * fy + m[7];
}
  inline void Vector2::Transform(const Matrix3& mat)
{
	const float* m = mat.M;
	float fx = x; float fy = y;
	x = m[0] * fx + m[3] * fy + m[6];  // w assumed to be 1.0F
	y = m[1] * fx + m[4] * fy + m[7];
}
   |  
  
 | 
 
  
Currently browsing [mathcode.zip] (12,899 bytes) - [math/Vector3.h] - (7,946 bytes)
 
 // ------------------------------------------------------------
// Machinery project - math library
// ------------------------------------------------------------
// (c) 2000 by Sascha 'EvilOne' Salevsky
// E-mail: Sascha.Salevsky@Ibykus.de
// ------------------------------------------------------------
#ifndef _mathematics_h_
#error "Dont include Vector3 directly!!! Use Mathematics.h instead."
#endif
  // Constructors
inline Vector3::Vector3()
{}
  inline Vector3::Vector3(float _x, float _y, float _z)
{
	x = _x; y = _y; z = _z;
}
  inline Vector3::Vector3(Vector3& other)
{
	x = other.x; y = other.y; z = other.z;
}
  inline Vector3::Vector3(const float* other)
{
	x = other[0]; y = other[1]; z = other[2];
}
  // assignemt
inline Vector3& Vector3::operator=(const Vector3& other)
{
	x = other.x; y = other.y; z = other.z;
	return *this;
}
  inline void Vector3::Assign(float _x, float _y, float _z)
{
	x = _x; y = _y; z = _z;
}
  inline void Vector3::Assign(const Vector3& other)
{
	x = other.x; y = other.y; z = other.z;
}
  inline void Vector3::Assign(float* other)
{
	x = other[0]; y = other[1]; z = other[2];
}
  // Swap
inline void Vector3::Swap(Vector3& other)
{
	float _x = x, _y = y, _z = z;
	x = other.x; y = other.y; z = other.z;
	other.x = _x; other.y = _y; other.z = _z;
}
  // Casting
inline Vector3::operator float*()
{
	return &x;
}
  inline Vector3::operator const float*() const
{
	return &x;
}
  // base functions
inline void Vector3::Add(const Vector3& other)
{
	x += other.x; y += other.y; z += other.z;
}
  inline void Vector3::Add(const Vector3& v1, const Vector3& v2)
{
	x = v1.x + v2.x; y = v1.y + v2.y; z = v1.z + v2.z;
}
  inline void Vector3::Sub(const Vector3& other)
{
	x -= other.x; y -= other.y; z -= other.z;
}
  inline void Vector3::Sub(const Vector3& v1, const Vector3& v2)
{
	x = v1.x - v2.x; y = v1.y - v2.y; z = v1.z - v2.z;
}
  inline void Vector3::Mul(float f)
{
	x *= f; y *= f; z *= f;
}
  inline void Vector3::Mul(const Vector3& other, float f)
{
	x = other.x * f; y = other.y * f; z = other.z * f;
}
  inline void Vector3::Div(float f)
{
	f = 1.0f / f;
	x *= f; y *= f; z *= f;
}
  inline void Vector3::Div(const Vector3& other, float f)
{
	f = 1.0f / f;
	x = other.x * f; y = other.y * f; z = other.z * f;
}
  inline void Vector3::Invert()
{
	x = -x; x = -y; z = -z;
}
  inline void Vector3::Invert(const Vector3& other)
{
	x = -other.x; x = -other.y; z = -other.z;
}
  // Linear combination
inline void Vector3::Combine(const Vector3& other, float s)
{
	x += other.x * s; y += other.y * s; z += other.z * s;
}
  inline void Vector3::Combine(float s, const Vector3& other, float t)
{
	x = x * s + other.x * t;
	y = y * s + other.y * t;
	z = z * s + other.z * t;
}
  inline void Vector3::Combine(const Vector3& v1, float s, const Vector3& v2, float t)
{
	x = v1.x * s + v2.x * t;
	y = v1.y * s + v2.y * t;
	z = v1.z * s + v2.z * t;
}
  // EvilOne's beloved overloads
inline Vector3& Vector3::operator+=(const Vector3& other)
{
	x += other.x; y += other.y; z += other.z;
	return *this;
}
  inline Vector3& Vector3::operator-=(const Vector3& other)
{
	x -= other.x; y -= other.y; z -= other.z;
	return *this;
}
  inline Vector3& Vector3::operator*=(float f)
{
	x *= f; y *= f; z *= f;
	return *this;
}
  inline Vector3& Vector3::operator-=(float f)
{
	x -= f; y -= f; z -= f;
	return *this;
}
  inline Vector3& Vector3::operator+=(float f)
{
	x += f; y += f; z += f;
	return *this;
}
  inline Vector3& Vector3::operator/=(float f)
{
	f = 1.0f / f;
	x *= f; y *= f; z *= f;
	return *this;
}
  inline Vector3& Vector3::operator-()
{
	x = -x; y = -y; z = -z;
	return *this;
}
  inline Vector3 Vector3::operator+(const Vector3& other) const
{
	return Vector3(x + other.x, y + other.y, z + other.z);
}
  inline Vector3 Vector3::operator-(const Vector3& other) const
{
	return Vector3(x - other.x, y - other.y, z - other.z);
}
  inline Vector3 Vector3::operator+(float f) const
{
	return Vector3(x + f, y + f, z + f);
}
  inline Vector3 Vector3::operator-(float f) const
{
	return Vector3(x - f, y - f, z - f);
}
  inline Vector3 Vector3::operator*(float f) const
{
	return Vector3(x * f, y * f, z * f);
}
  inline Vector3 Vector3::operator/(float f) const
{
	f = 1.0f / f;
	return Vector3(x * f, y * f, z * f);
}
  // Linear Algebra
inline float Vector3::Dot(const Vector3& v) const
{
	return x * v.x + y * v.y + z * v.z;
}
  inline void Vector3::Cross(const Vector3& v)
{
	float _x = y * v.z - z * v.y;
	float _y = z * v.x - x * v.z;
	float _z = x * v.y - y * v.x;
	x = _x; y = _y; z = _z;
}
  inline void Vector3::Cross(const Vector3& v1, const Vector3& v2)
{
	float _x = v1.y * v2.z - v1.z * v2.y;
	float _y = v1.z * v2.x - v1.x * v2.z;
	float _z = v1.x * v2.y - v1.y * v2.x;
	x = _x; y = _y; z = _z;
}
  inline float Vector3::Length() const
{
	return (float)sqrt(x * x + y * y + z * z);
}
  inline float Vector3::LengthSqr() const
{
	return x * x + y * y + z * z;
}
  inline float Vector3::Distance(const Vector3& other) const
{
	Vector3 tmp = other - *this;
	return tmp.Length();
}
  inline float Vector3::DistanceSqr(const Vector3& other) const
{
	Vector3 tmp = other - *this;
	return tmp.LengthSqr();
}
  inline void Vector3::Normalize()
{
	float f = 1.0f / Length();
	x = x * f; y = y * f; z = z * f;
}
  inline void Vector3::Normalize(const Vector3& other)
{
	float f = 1.0f / other.Length();
	x = other.x * f; y = other.y * f; z = other.z * f;
}
  
// Other usefull funtions
inline void Vector3::Clamp(float min, float max)
{
	x = ::Clamp(x, min, max);
	y = ::Clamp(y, min, max);
	z = ::Clamp(z, min, max);
}
  inline void Vector3::Lerp(const Vector3& v1, const Vector3& v2, float s)
{
	x = ::Lerp(s, v1.x, v2.x);
	y = ::Lerp(s, v1.y, v2.y);
	z = ::Lerp(s, v1.z, v2.z);
}
  // Operations with a plane
inline void Vector3::Intersect(const Vector3& start, float s, const Vector3& end, float e)
{
	float ws = s / (e - s);
	float we = e / (e - s);
	x = start.x * ws + end.x * we;
	y = start.y * ws + end.y * we;
	z = start.z * ws + end.z * we;
}
  inline void Vector3::Intersect(const Plane& p, const Vector3& start, const Vector3& end)
{
	float s = p.Distance(start);
	float e = p.Distance(end);
	Intersect(start, s, end, e);
}
  inline void Vector3::Reflect(const Plane& p, const Vector3& v)
{
	Vector3 tmp = p.n * 2 * v.Dot(p.n) - v;
	x = tmp.x; y = tmp.y; z = tmp.z;
}
  // Operations with a matrix
inline void Vector3::Transform(const Matrix4& mat)
{
	const float* m = mat.M;
	float fx = x; float fy = y; float fz = z;
	x = m[0] * fx + m[4] * fy + m[8] * fz + m[12];  // w assumed to be 1.0F
	y = m[1] * fx + m[5] * fy + m[9] * fz + m[13];
	z = m[2] * fx + m[6] * fy + m[10] * fz + m[14];
}
  inline void Vector3::Transform(const Matrix4& mat, const Vector3& other)
{
	const float* m = mat.M;
	float fx = other.x; float fy = other.y; float fz = other.z;
	x = m[0] * fx + m[4] * fy + m[8] * fz + m[12];  // w assumed to be 1.0F
	y = m[1] * fx + m[5] * fy + m[9] * fz + m[13];
	z = m[2] * fx + m[6] * fy + m[10] * fz + m[14];
}
  inline void Vector3::TransformTranspose(const Matrix4& mat)
{
	const float* m = mat.M;
	float fx = x; float fy = y; float fz = z;
	x = m[0] * fx + m[1] * fy + m[2] * fz + m[3];  // w assumed to be 1.0F
	y = m[4] * fx + m[5] * fy + m[6] * fz + m[7];
	z = m[8] * fx + m[9] * fy + m[10] * fz + m[11];
}
  inline void Vector3::TransformTranspose(const Matrix4& mat, const Vector3& other)
{
	const float* m = mat.M;
	float fx = other.x; float fy = other.y; float fz = other.z;
	x = m[0] * fx + m[1] * fy + m[2] * fz + m[3];  // w assumed to be 1.0F
	y = m[4] * fx + m[5] * fy + m[6] * fz + m[7];
	z = m[8] * fx + m[9] * fy + m[10] * fz + m[11];
}
     |  
  
 | 
 
 
 
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
 
 
 |