2 $Id: vector.cxx,v 1.1 2002/11/20 00:33:56 grumbel Exp $
4 ------------------------------------------------------------------------
5 ClanLib, the platform independent game SDK.
7 This library is distributed under the GNU LIBRARY GENERAL PUBLIC LICENSE
8 version 2. See COPYING for details.
10 For a total list of contributers see CREDITS.
12 ------------------------------------------------------------------------
14 1999/06/19 Daniel Vogel
16 totally replaced old CL_Vector with this code
23 CL_Vector::CL_Vector(float x
, float y
, float z
, float w
)
31 CL_Vector::CL_Vector(const CL_Vector
&other
)
39 float CL_Vector::norm() const
42 return (float)sqrt(x
*x
+y
*y
+z
*z
);
44 return sqrt(x
*x
+y
*y
+z
*z
);
48 void CL_Vector::normalize()
59 float CL_Vector::dot(const CL_Vector
& v
) const
61 return x
*v
.x
+ y
*v
.y
+ z
*v
.z
;
64 float CL_Vector::angle(const CL_Vector
& v
) const
67 return (float)acos(dot(v
)/(norm()*v
.norm()));
69 return std::acos(dot(v
)/(norm()*v
.norm()));
73 CL_Vector
CL_Vector::cross(const CL_Vector
& v
) const
75 CL_Vector tmp
= CL_Vector(y
* v
.z
- z
* v
.y
,
81 // quick hack, same as glRotatef(angle, a);
82 CL_Vector
CL_Vector::rotate(float angle
, const CL_Vector
& a
) const
84 CL_Vector tmp
= CL_Vector();
87 float s
= (float)sin(angle
);
88 float c
= (float)cos(angle
);
90 float s
= std::sin(angle
);
91 float c
= std::cos(angle
);
94 tmp
.x
= x
*(a
.x
*a
.x
*(1-c
)+c
) + y
*(a
.x
*a
.y
*(1-c
)-a
.z
*s
) + z
*(a
.x
*a
.z
*(1-c
)+a
.y
*s
);
95 tmp
.y
= x
*(a
.y
*a
.x
*(1-c
)+a
.z
*s
) + y
*(a
.y
*a
.y
*(1-c
)+c
) + z
*(a
.y
*a
.z
*(1-c
)-a
.x
*s
);
96 tmp
.z
= x
*(a
.x
*a
.z
*(1-c
)-a
.y
*s
) + y
*(a
.y
*a
.z
*(1-c
)+a
.x
*s
) + z
*(a
.z
*a
.z
*(1-c
)+c
);
100 void CL_Vector::round()
108 CL_Vector
CL_Vector::operator * (float s
) const
110 return CL_Vector(s
* x
,
116 CL_Vector
operator * (float s
, const CL_Vector
& v
)
118 return CL_Vector(s
* v
.x
,
124 void CL_Vector::operator += (const CL_Vector
& v
)
132 void CL_Vector::operator -= (const CL_Vector
& v
)
140 void CL_Vector::operator *= (float s
)
148 CL_Vector
CL_Vector::operator + (const CL_Vector
& v
) const
150 return CL_Vector(x
+ v
.x
,
156 CL_Vector
CL_Vector::operator - (const CL_Vector
& v
) const
158 return CL_Vector(x
- v
.x
,
164 CL_Vector
CL_Vector::operator - () const
172 CL_Vector
& CL_Vector::operator = (const CL_Vector
& v
)
181 int CL_Vector::operator == (const CL_Vector
& v
) const
183 return ((x
== v
.x
) && (y
== v
.y
) && (z
== v
.z
) && (w
== v
.w
));
186 int CL_Vector::operator != (const CL_Vector
& v
) const
188 return !(operator == (v
));
191 float & CL_Vector::operator [] (int n
)
204 std::ostream
& operator << (std::ostream
& os
, const CL_Vector
& v
)
206 os
<< v
.x
<< " " << v
.y
<< " " << v
.z
;