1 //////////////////////////////////////////////////////////////////////////////////////////
2 //	VECTOR4D.cpp
3 //	Function definitions for 4d vector class
4 //	Downloaded from: www.paulsprojects.net
5 //	Created:	20th July 2002
6 //	Modified:	15th August 2002	-	prevent divide by zero in operator VECTOR3D()
7 //	Modified:	8th November 2002	-	Changed Constructor layout
8 //									-	Some speed Improvements
9 //									-	Corrected Lerp
10 //
11 //	Copyright (c) 2006, Paul Baker
12 //	Distributed under the New BSD Licence. (See accompanying file License.txt or copy at
13 //	http://www.paulsprojects.net/NewBSDLicense.txt)
14 //////////////////////////////////////////////////////////////////////////////////////////
15 
16 #include "Maths.h"
17 
RotateX(double angle)18 void VECTOR4D::RotateX(double angle)
19 {
20 	(*this)=GetRotatedX(angle);
21 }
22 
GetRotatedX(double angle) const23 VECTOR4D VECTOR4D::GetRotatedX(double angle) const
24 {
25 	VECTOR3D v3d(x, y, z);
26 
27 	v3d.RotateX(angle);
28 
29 	return VECTOR4D(v3d.x, v3d.y, v3d.z, w);
30 }
31 
RotateY(double angle)32 void VECTOR4D::RotateY(double angle)
33 {
34 	(*this)=GetRotatedY(angle);
35 }
36 
GetRotatedY(double angle) const37 VECTOR4D VECTOR4D::GetRotatedY(double angle) const
38 {
39 	VECTOR3D v3d(x, y, z);
40 
41 	v3d.RotateY(angle);
42 
43 	return VECTOR4D(v3d.x, v3d.y, v3d.z, w);
44 }
45 
RotateZ(double angle)46 void VECTOR4D::RotateZ(double angle)
47 {
48 	(*this)=GetRotatedZ(angle);
49 }
50 
GetRotatedZ(double angle) const51 VECTOR4D VECTOR4D::GetRotatedZ(double angle) const
52 {
53 	VECTOR3D v3d(x, y, z);
54 
55 	v3d.RotateZ(angle);
56 
57 	return VECTOR4D(v3d.x, v3d.y, v3d.z, w);
58 }
59 
RotateAxis(double angle,const VECTOR3D & axis)60 void VECTOR4D::RotateAxis(double angle, const VECTOR3D & axis)
61 {
62 	(*this)=GetRotatedAxis(angle, axis);
63 }
64 
GetRotatedAxis(double angle,const VECTOR3D & axis) const65 VECTOR4D VECTOR4D::GetRotatedAxis(double angle, const VECTOR3D & axis) const
66 {
67 	VECTOR3D v3d(x, y, z);
68 
69 	v3d.RotateAxis(angle, axis);
70 
71 	return VECTOR4D(v3d.x, v3d.y, v3d.z, w);
72 }
73 
74 
operator *(float scaleFactor,const VECTOR4D & rhs)75 VECTOR4D operator*(float scaleFactor, const VECTOR4D & rhs)
76 {
77 	return rhs*scaleFactor;
78 }
79 
operator ==(const VECTOR4D & rhs) const80 bool VECTOR4D::operator==(const VECTOR4D & rhs) const
81 {
82 	if(x==rhs.x && y==rhs.y && z==rhs.z && w==rhs.w)
83 		return true;
84 
85 	return false;
86 }
87 
operator VECTOR3D()88 VECTOR4D::operator VECTOR3D()
89 {
90 	if(w==0.0f || w==1.0f)
91 		return VECTOR3D(x, y, z);
92 	else
93 		return VECTOR3D(x/w, y/w, z/w);
94 }
95