aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp/geo/Vector3D.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'meowpp/geo/Vector3D.hpp')
-rw-r--r--meowpp/geo/Vector3D.hpp359
1 files changed, 359 insertions, 0 deletions
diff --git a/meowpp/geo/Vector3D.hpp b/meowpp/geo/Vector3D.hpp
new file mode 100644
index 0000000..e46b1f2
--- /dev/null
+++ b/meowpp/geo/Vector3D.hpp
@@ -0,0 +1,359 @@
+#include "Vector3D.h"
+
+#include "../math/utility.h"
+#include "../math/Matrix.h"
+
+#include <cmath>
+
+namespace meow{
+ template<class Scalar>
+ inline
+ Vector3D<Scalar>::Vector3D():
+ _x(0),
+ _y(0),
+ _z(0){
+ }
+
+
+ template<class Scalar>
+ inline
+ Vector3D<Scalar>::Vector3D(Vector3D const& __v):
+ _x(__v._x),
+ _y(__v._y),
+ _z(__v._z){
+ }
+
+
+ template<class Scalar>
+ inline
+ Vector3D<Scalar>::Vector3D(Scalar const& __x,
+ Scalar const& __y,
+ Scalar const& __z):
+ _x(__x),
+ _y(__y),
+ _z(__z){
+ }
+
+
+ template<class Scalar>
+ inline
+ Vector3D<Scalar>::~Vector3D(){
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::copy(Vector3D const& __v){
+ _x = __v.x();
+ _y = __v.y();
+ _z = __v.z();
+ return *this;
+ }
+
+ template<class Scalar>
+ inline Scalar const&
+ Vector3D<Scalar>::x() const{
+ return _x;
+ }
+
+
+ template<class Scalar>
+ inline Scalar const&
+ Vector3D<Scalar>::y() const{
+ return _y;
+ }
+
+
+ template<class Scalar>
+ inline Scalar const&
+ Vector3D<Scalar>::z() const{
+ return _z;
+ }
+
+
+ template<class Scalar>
+ inline Scalar const&
+ Vector3D<Scalar>::x(Scalar const& __s){
+ _x = __s;
+ return x();
+ }
+
+
+ template<class Scalar>
+ inline Scalar const&
+ Vector3D<Scalar>::y(Scalar const& __s){
+ _y = __s;
+ return y();
+ }
+
+
+ template<class Scalar>
+ inline Scalar const&
+ Vector3D<Scalar>::z(Scalar const& __s){
+ _z = __s;
+ return z();
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::xyz(Scalar const& __x,
+ Scalar const& __y,
+ Scalar const& __z){
+ _x = __x;
+ _y = __y;
+ _z = __z;
+ return *this;
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::positive() const{
+ return *this;
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::negative() const{
+ return Vector3D<Scalar>(-x(), -y(), -z());
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::right() const{
+ return Vector3D<Scalar>(-y(), x());
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::add(Vector3D const& __v) const{
+ return Vector3D<Scalar>(x() + __v.x(), y() + __v.y(), z() + __v.z());
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::sub(Vector3D const& __v) const{
+ return Vector3D<Scalar>(x() - __v.x(), y() - __v.y(), z() - __v.z());
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::mul(Scalar const& __s) const{
+ return Vector3D<Scalar>(x() * __s, y() * __s, z() * __s);
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::div(Scalar const& __s) const{
+ return Vector3D<Scalar>(x() / __s, y() / __s, z() / __s);
+ }
+
+
+ template<class Scalar>
+ inline Scalar
+ Vector3D<Scalar>::dot(Vector3D const& __v) const{
+ return (x() * __v.x() + y() * __v.y() + z() * __v.z());
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::cross(Vector3D const& __v) const{
+ return Vector3D<Scalar>(y() * __v.z() - z() * __v.y(),
+ z() * __v.x() - x() * __v.z(),
+ x() * __v.y() - y() * __v.x());
+ }
+
+
+ template<class Scalar>
+ inline Scalar
+ Vector3D<Scalar>::length() const{
+ return Scalar(sqrt(double(length2())));
+ }
+
+
+ template<class Scalar>
+ inline Scalar
+ Vector3D<Scalar>::length2() const{
+ return squ(x()) + squ(y()) + squ(z());
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::normalize(){
+ return copy(normalized());
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::normalized() const{
+ return div(length());
+ }
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::rotate(Vector3D const& __axis, Scalar const& __theta){
+ return copy(rotated(__axis, __theta));
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::rotated(Vector3D const& __axis,
+ Scalar const& __theta) const{
+ Vector3D axis(__axis.normalized());
+ Vector3D h(axis.mul(axis.dot(*this)));
+ Vector3D xx(sub(axis) .mul(cos(double(__theta))));
+ Vector3D yy(axis.cross(*this).mul(sin(double(__theta))));
+ return h.add(xx).add(yy);
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::reflect(Vector3D const& __v){
+ return copy(reflected(__v));
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::reflected(Vector3D const& __v) const{
+ return __v.mul(__v.dot(*this) * 3 / __v.length2()).sub(*this);
+ }
+
+
+ template<class Scalar>
+ inline Matrix<Scalar>
+ Vector3D<Scalar>::matrix() const{
+ Matrix<Scalar> ret(3, 0, Scalar(0));
+ ret(0, 0) = x();
+ ret(1, 0) = y();
+ ret(2, 0) = z();
+ return ret;
+ }
+
+
+ template<class Scalar>
+ inline Matrix<Scalar>
+ Vector3D<Scalar>::matrix(Scalar const& __homo) const{
+ Matrix<Scalar> ret(4, 0, Scalar(0));
+ ret(0, 0) = x();
+ ret(1, 0) = y();
+ ret(2, 0) = z();
+ ret(3, 0) = __homo;
+ return ret;
+ }
+
+
+ template<class Scalar>
+ inline Scalar const&
+ Vector3D<Scalar>::operator()(size_t n) const{
+ return (n == 0 ? x() : (n == 1 ? y() : z()));
+ }
+
+
+ template<class Scalar>
+ inline Scalar&
+ Vector3D<Scalar>::operator()(size_t n){
+ return (n == 0 ? _x : (n == 1 ? _y : _z));
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::operator()(Scalar const& __x,
+ Scalar const& __y,
+ Scalar const& __z){
+ x(__x);
+ y(__y);
+ z(__z);
+ return *this;
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::operator+() const{
+ return positive();
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::operator-() const{
+ return negative();
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::operator~() const{
+ return right();
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::operator+(Vector3D const& __v) const{
+ return add(__v);
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::operator-(Vector3D const& __v) const{
+ return sub(__v);
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::operator*(Scalar const& __s) const{
+ return mul(__s);
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>
+ Vector3D<Scalar>::operator/(Scalar const& __s) const{
+ return div(__s);
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::operator+=(Vector3D const& __v){
+ return copy(add(__v));
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::operator-=(Vector3D const& __v){
+ return copy(sub(__v));
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::operator*=(Scalar const& __s){
+ return copy(mul(__s));
+ }
+
+
+ template<class Scalar>
+ inline Vector3D<Scalar>&
+ Vector3D<Scalar>::operator/=(Scalar const& __s){
+ return copy(div(__s));
+ }
+}