20 #ifndef CS488_ALGEBRA_HPP
21 #define CS488_ALGEBRA_HPP
23 #pragma warning(disable: 4996)
38 static const double M_PI = 3.14159265358979323846;
80 double& operator[](
size_t _idx)
86 double operator[](
size_t _idx )
const
98 friend class boost::serialization::access;
102 template<
class Archive>
103 void serialize( Archive &_ar,
const unsigned int _version )
170 if ( v[0] == _other[0] && v[1] == _other[1] && v[2] == _other[2] )
186 double length2()
const
188 return ( v[0] * v[0] ) + ( v[1] * v[1] ) + ( v[2] * v[2] );
192 double length()
const
194 return sqrt( length2() );
198 double& operator[](
size_t _idx )
204 double operator[](
size_t _idx )
const
212 return ( v[0] * _other.v[0] ) + ( v[1] * _other.v[1] ) + ( v[2] * _other.v[2] );
222 friend class boost::serialization::access;
226 template<
class Archive>
227 void serialize( Archive &_ar,
const unsigned int _version )
229 _ar & v[0] & v[1] & v[2];
273 double& operator[](
size_t _idx )
279 double operator[](
size_t _idx )
const
287 return ( v[0] * _other.v[0] ) + ( v[1] * _other.v[1] ) + ( v[2] * _other.v[2] );
291 double length2()
const
293 return ( v[0] * v[0] ) + ( v[1] * v[1] ) + ( v[2] * v[2] );
297 double length()
const
299 return sqrt( length2() );
308 return Vector3D( v[1]*_other[2] - v[2]*_other[1],
309 v[2]*_other[0] - v[0]*_other[2],
310 v[0]*_other[1] - v[1]*_other[0] );
320 friend class boost::serialization::access;
324 template<
class Archive>
325 void serialize( Archive &_ar,
const unsigned int _version )
327 _ar & v[0] & v[1] & v[2];
334 return Vector3D( _s * _v[0], _s * _v[1], _s * _v[2] );
340 return Vector3D( _a[0] + _b[0], _a[1] + _b[1], _a[2] + _b[2] );
346 return Point3D(_a[0]+_b[0], _a[1]+_b[1], _a[2]+_b[2]);
352 return Point2D(_a[0]+_b[0], _a[1]+_b[1] );
358 return Point2D(_a[0]-_b[0], _a[1]-_b[1] );
364 return Point3D(_a[0]+_b[0], _a[1]+_b[1], _a[2]+_b[2]);
370 return Point3D( _a * _b[0], _a * _b[1], _a * _b[2] );
376 return Vector3D(_a[0]-_b[0], _a[1]-_b[1], _a[2]-_b[2]);
382 return Vector3D(_a[0]-_b[0], _a[1]-_b[1], _a[2]-_b[2]);
388 return Vector3D(-_a[0], -_a[1], -_a[2]);
394 return Point3D(_a[0]-_b[0], _a[1]-_b[1], _a[2]-_b[2]);
400 return ( _a[0] == _b[0] && _a[1] == _b[1] && _a[2] == _b[2] );
406 return ( _a[0] != _b[0] && _a[1] != _b[1] && _a[2] != _b[2] );
412 return Point3D(_a[0]-_b[0], _a[1]-_b[1], _a[2]-_b[2]);
424 return _os <<
"p<" << _p[0] <<
"," << _p[1] <<
">";
430 return _os <<
"p<" << _p[0] <<
"," << _p[1] <<
"," << _p[2] <<
">";
436 return _os <<
"v<" << _v[0] <<
"," << _v[1] <<
"," << _v[2] <<
">";
440 class RTFXAPI Matrix4x4;
461 Vector4D(
double _x,
double _y,
double _z,
double _w )
489 double& operator[](
size_t _idx )
495 double operator[](
size_t _idx )
const
501 friend class boost::serialization::access;
505 template<
class Archive>
506 void serialize( Archive &_ar,
const unsigned int _version )
508 _ar & v[0] & v[1] & v[2] & v[3];
526 std::fill(v, v+16, 0.0);
536 double _b0,
double _b1,
double _b2,
537 double _c0,
double _c1,
double _c2 )
563 for (
int i = 0; i < 16; i ++ )
595 for (
int i = 0; i < 16; i ++ )
602 for (
int i = 0; i < 16; i ++ )
611 return Vector4D(v[4*_row], v[4*_row+1], v[4*_row+2], v[4*_row+3]);
615 double *getRow(
size_t _row )
617 return (
double*)v + 4*_row;
623 return Vector4D(v[_col], v[4+_col], v[8+_col], v[12+_col]);
630 return getRow( _row );
635 double *operator[](
size_t _row )
637 return getRow( _row );
643 return Matrix4x4( getColumn(0), getColumn(1),
644 getColumn(2), getColumn(3) );
654 const double *begin()
const
660 const double *end()
const
674 const double * data = _o.
data();
675 for (
int i = 0; i < 16; i ++ )
677 if ( v[i] != data[i] )
686 friend class boost::serialization::access;
688 template<
class Archive>
689 void serialize( Archive &_ar,
const unsigned int _version )
691 for (
int i = 0; i < 16; i ++ )
701 for(
size_t i = 0; i < 4; ++i)
705 for(
size_t j = 0; j < 4; ++j)
707 ret_[i][j] = row_[0] * _b[0][j] + row_[1] * _b[1][j] +
708 row_[2] * _b[2][j] + row_[3] * _b[3][j];
719 _v[0] * _M[0][0] + _v[1] * _M[0][1] + _v[2] * _M[0][2],
720 _v[0] * _M[1][0] + _v[1] * _M[1][1] + _v[2] * _M[1][2],
721 _v[0] * _M[2][0] + _v[1] * _M[2][1] + _v[2] * _M[2][2]);
728 _p[0] * _M[0][0] + _p[1] * _M[0][1] + _p[2] * _M[0][2] + _M[0][3],
729 _p[0] * _M[1][0] + _p[1] * _M[1][1] + _p[2] * _M[1][2] + _M[1][3],
730 _p[0] * _M[2][0] + _p[1] * _M[2][1] + _p[2] * _M[2][2] + _M[2][3]);
737 _n[0] * _M[0][0] + _n[1] * _M[1][0] + _n[2] * _M[2][0],
738 _n[0] * _M[0][1] + _n[1] * _M[1][1] + _n[2] * _M[2][1],
739 _n[0] * _M[0][2] + _n[1] * _M[1][2] + _n[2] * _M[2][2]);
745 return _os <<
"[" << _M[0][0] <<
" " << _M[0][1] <<
" "
746 << _M[0][2] <<
" " << _M[0][3] <<
"]" << std::endl
747 <<
"[" << _M[1][0] <<
" " << _M[1][1] <<
" "
748 << _M[1][2] <<
" " << _M[1][3] <<
"]" << std::endl
749 <<
"[" << _M[2][0] <<
" " << _M[2][1] <<
" "
750 << _M[2][2] <<
" " << _M[2][3] <<
"]" << std::endl
751 <<
"[" << _M[3][0] <<
" " << _M[3][1] <<
" "
752 << _M[3][2] <<
" " << _M[3][3] <<
"]";
771 rgb[0] = _other.
rgb[0];
772 rgb[1] = _other.
rgb[1];
773 rgb[2] = _other.
rgb[2];
775 hsv[0] = _other.
hsv[0];
776 hsv[1] = _other.
hsv[1];
777 hsv[2] = _other.
hsv[2];
779 alpha = _other.
alpha;
785 rgb[0] = _other.
rgb[0];
786 rgb[1] = _other.
rgb[1];
787 rgb[2] = _other.
rgb[2];
789 hsv[0] = _other.
hsv[0];
790 hsv[1] = _other.
hsv[1];
791 hsv[2] = _other.
hsv[2];
793 alpha = _other.
alpha;
798 void SetRGB(
double _r,
double _g,
double _b )
806 void SetRed(
double _r )
812 void SetGreen(
double _g )
818 void SetBlue(
double _b )
824 void SetHSV(
double _h,
double _s,
double _v )
832 void SetHue(
double _h )
838 void SetSaturation(
double _s )
844 void SetValue(
double _v )
874 void SetAlpha(
double _alpha )
883 void MultiplyByScalar(
double _s )
885 SetRGB( rgb[0] * _s, rgb[1] * _s, rgb[2] * _s );
886 SetHSV( hsv[0] * _s, hsv[1] * _s, hsv[2] * _s );
901 if ( GetRed() != _c.
GetRed() ||
909 if ( GetHue() != _c.
GetHue() ||
935 friend class boost::serialization::access;
937 template<
class Archive>
938 void serialize( Archive &_ar,
const unsigned int _version )
940 _ar & rgb[0] & rgb[1] & rgb[2] & hsv[0] & hsv[1] & hsv[2] & alpha;
944 #endif // CS488_ALGEBRA_HPP