2014-08-08 21:12:37 -07:00
|
|
|
/* vector.cc
|
|
|
|
* vim: set tw=80:
|
|
|
|
* Eryn Wells <eryn@erynwells.me>
|
|
|
|
*/
|
|
|
|
|
2014-08-08 23:05:38 -07:00
|
|
|
#include <cmath>
|
|
|
|
|
2014-08-08 21:12:37 -07:00
|
|
|
#include "basics/vector.hh"
|
|
|
|
|
|
|
|
|
|
|
|
namespace charles {
|
|
|
|
namespace basics {
|
|
|
|
|
2014-08-08 21:47:44 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Vector4 --
|
|
|
|
*/
|
2014-08-08 21:12:37 -07:00
|
|
|
Vector4::Vector4()
|
2014-08-08 21:47:44 -07:00
|
|
|
: Vector4(0, 0, 0)
|
|
|
|
{ }
|
|
|
|
|
2014-08-08 21:12:37 -07:00
|
|
|
|
2014-08-08 21:47:44 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Vector4 --
|
|
|
|
*/
|
|
|
|
Vector4::Vector4(const Double& x,
|
|
|
|
const Double& y,
|
|
|
|
const Double& z)
|
|
|
|
{
|
|
|
|
mData[0] = x;
|
|
|
|
mData[1] = y;
|
|
|
|
mData[2] = z;
|
|
|
|
mData[3] = 1.0;
|
2014-08-08 21:12:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::X --
|
|
|
|
*/
|
|
|
|
Double&
|
|
|
|
Vector4::X()
|
|
|
|
{
|
|
|
|
return mData[0];
|
|
|
|
}
|
|
|
|
|
2014-08-09 09:01:52 -07:00
|
|
|
const Double&
|
|
|
|
Vector4::X()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return mData[0];
|
|
|
|
}
|
|
|
|
|
2014-08-08 21:12:37 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Y --
|
|
|
|
*/
|
|
|
|
Double&
|
|
|
|
Vector4::Y()
|
|
|
|
{
|
|
|
|
return mData[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-09 09:01:52 -07:00
|
|
|
const Double&
|
|
|
|
Vector4::Y()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return mData[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-08 21:12:37 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Z --
|
|
|
|
*/
|
|
|
|
Double&
|
|
|
|
Vector4::Z()
|
|
|
|
{
|
|
|
|
return mData[2];
|
|
|
|
}
|
|
|
|
|
2014-08-08 23:05:38 -07:00
|
|
|
|
2014-08-09 09:32:48 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Z --
|
|
|
|
*/
|
2014-08-09 09:01:52 -07:00
|
|
|
const Double&
|
|
|
|
Vector4::Z()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return mData[2];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-09 09:32:48 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::operator* --
|
|
|
|
*/
|
|
|
|
Vector4
|
|
|
|
Vector4::operator*(const Double& rhs)
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return dynamic_cast<Vector4&&>(*this * rhs);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::operator+ --
|
|
|
|
*/
|
|
|
|
Vector4
|
|
|
|
Vector4::operator+(const Vector4& rhs)
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return Vector4(*this) += rhs;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::operator+= --
|
|
|
|
*/
|
|
|
|
Vector4&
|
|
|
|
Vector4::operator+=(const Vector4& rhs)
|
|
|
|
{
|
|
|
|
mData[0] += rhs.mData[0];
|
|
|
|
mData[1] += rhs.mData[1];
|
|
|
|
mData[2] += rhs.mData[2];
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::operator- --
|
|
|
|
*/
|
|
|
|
Vector4
|
|
|
|
Vector4::operator-(const Vector4& rhs)
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return Vector4(*this) -= rhs;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::operator-= --
|
|
|
|
*/
|
|
|
|
Vector4&
|
|
|
|
Vector4::operator-=(const Vector4& rhs)
|
|
|
|
{
|
|
|
|
return *this += -rhs;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::operator- --
|
|
|
|
*/
|
|
|
|
Vector4
|
|
|
|
Vector4::operator-()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return Vector4(-X(), -Y(), -Z());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-08 23:05:38 -07:00
|
|
|
/*
|
2014-08-09 08:31:25 -07:00
|
|
|
* charles::basics::Vector4::Length2 --
|
2014-08-08 23:05:38 -07:00
|
|
|
*/
|
|
|
|
Double
|
|
|
|
Vector4::Length2()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return mData[0] * mData[0] + mData[1] * mData[1] + mData[2] * mData[2];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-09 08:31:25 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Length --
|
|
|
|
*/
|
2014-08-08 23:05:38 -07:00
|
|
|
Double
|
|
|
|
Vector4::Length()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return std::sqrt(Length2());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-09 08:31:25 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Dot --
|
|
|
|
*/
|
2014-08-08 23:05:38 -07:00
|
|
|
Double
|
|
|
|
Vector4::Dot(const Vector4& rhs)
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return mData[0] * rhs.mData[0] + mData[1] * rhs.mData[1] + mData[2] + rhs.mData[2];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-09 08:31:25 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Cross --
|
|
|
|
*/
|
2014-08-08 23:05:38 -07:00
|
|
|
Vector4
|
|
|
|
Vector4::Cross(const Vector4& rhs)
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return Vector4(mData[1]*rhs.mData[2] - mData[2]*rhs.mData[1],
|
|
|
|
mData[2]*rhs.mData[0] - mData[0]*rhs.mData[2],
|
|
|
|
mData[0]*rhs.mData[1] - mData[1]*rhs.mData[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-09 08:31:25 -07:00
|
|
|
/*
|
|
|
|
* charles::basics::Vector4::Normalize --
|
|
|
|
*/
|
2014-08-08 23:05:38 -07:00
|
|
|
Vector4&
|
|
|
|
Vector4::Normalize()
|
|
|
|
{
|
2014-08-09 08:31:25 -07:00
|
|
|
/* XXX: Is there some way to do this with the Matrix<>::operator/? */
|
|
|
|
const Double len = Length();
|
|
|
|
X() = X() / len;
|
|
|
|
Y() = Y() / len;
|
|
|
|
Z() = Z() / len;
|
|
|
|
return *this;
|
2014-08-08 23:05:38 -07:00
|
|
|
}
|
|
|
|
|
2014-08-09 09:32:48 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* charles::basics::operator* --
|
|
|
|
*/
|
|
|
|
Vector4
|
|
|
|
operator*(const Double& lhs,
|
|
|
|
const Vector4& rhs)
|
|
|
|
{
|
|
|
|
return rhs * lhs;
|
|
|
|
}
|
|
|
|
|
2014-08-08 21:12:37 -07:00
|
|
|
} /* namespace basics */
|
|
|
|
} /* namespace charles */
|
|
|
|
|