charles/src/basics/vector.cc

230 lines
3.1 KiB
C++
Raw Normal View History

2014-08-08 21:12:37 -07:00
/* vector.cc
* vim: set tw=80:
* Eryn Wells <eryn@erynwells.me>
*/
#include <cmath>
2014-08-08 21:12:37 -07:00
#include "basics/vector.hh"
namespace charles {
namespace basics {
/*
* 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
}
2014-08-09 09:57:35 -07:00
Vector4::Vector4(const Matrix<4,1>&& rhs)
: Vector4(static_cast<const Vector4&&>(rhs))
{ }
2014-08-08 21:12:37 -07:00
/*
* charles::basics::Vector4::X --
*/
Double&
Vector4::X()
{
return mData[0];
}
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];
}
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];
}
/*
* charles::basics::Vector4::Z --
*/
const Double&
Vector4::Z()
const
{
return mData[2];
}
/*
* charles::basics::Vector4::operator* --
*/
Vector4
Vector4::operator*(const Double& rhs)
const
{
2014-08-09 09:57:35 -07:00
return static_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());
}
/*
* charles::basics::Vector4::Length2 --
*/
Double
Vector4::Length2()
const
{
return mData[0] * mData[0] + mData[1] * mData[1] + mData[2] * mData[2];
}
/*
* charles::basics::Vector4::Length --
*/
Double
Vector4::Length()
const
{
return std::sqrt(Length2());
}
/*
* charles::basics::Vector4::Dot --
*/
Double
Vector4::Dot(const Vector4& rhs)
const
{
return mData[0] * rhs.mData[0] + mData[1] * rhs.mData[1] + mData[2] + rhs.mData[2];
}
/*
* charles::basics::Vector4::Cross --
*/
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]);
}
/*
* charles::basics::Vector4::Normalize --
*/
Vector4&
Vector4::Normalize()
{
/* 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;
}
/*
* 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 */