summaryrefslogtreecommitdiff
path: root/src/main/Vector3D.cc
blob: 94952c3a9255923585c9fe7444aeed6a790233dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
 * Vector3D.cc
 *
 *  Created on: Mar 1, 2011
 *      Author: Jakob Odersky
 */

#include <math.h>
#include <sstream>
#include "Vector3D.h"
#include "exceptions.h"

using namespace std;

namespace vhc {

Vector3D::Vector3D(double _x, double _y, double _z) : x(_x), y(_y), z(_z), normCache(-1) {};

double Vector3D::getX() const {return x;};

double Vector3D::getY() const {return y;};

double Vector3D::getZ() const {return z;};

bool Vector3D::operator== (const Vector3D& v) const {return x == v.x && y == v.y && z == v.z;};

bool Vector3D::operator!= (const Vector3D& v) const {return !((*this) == (v));};

Vector3D Vector3D::operator+ (const Vector3D& v) const {return Vector3D(x + v.x, y + v.y, z + v.z);};

Vector3D Vector3D::operator* (double n) const {return Vector3D(x * n, y * n, z * n);};

Vector3D Vector3D::operator- () const {return (*this) * (-1.0);};

Vector3D Vector3D::operator- (const Vector3D& v) const {return (*this) + -v;};

Vector3D Vector3D::operator/ (double n) const {return (*this) * (1.0 / n) ;};

double Vector3D::dot(const Vector3D& v) const {return x * v.x + y * v.y + z * v.z;};

Vector3D Vector3D::cross(const Vector3D& v) const {return Vector3D(y * v.z - v.y * z, v.x * z - x * v.z, x * v.y - v.x * y);};

Vector3D Vector3D::operator~ () const {
	if (norm() != 0.0) return (*this) / norm();
	else throw UnsupportedOperationException("Zero vector does not have a unit vector.");
};

Vector3D Vector3D::unit() const {return ~(*this);}

double Vector3D::norm() const {
	if (normCache == -1) normCache = sqrt(dot(*this));
	return normCache;
}

double Vector3D::minNorm() const {return min(x, min(y, z));}

double Vector3D::normSquare() const {return dot(*this);}

std::string Vector3D::toString() const {
	std::stringstream s;
	s << "(" << x << ", " << y << ", " << z << ")";
	return s.str();
};

double Vector3D::angle(const Vector3D& v) const {return acos(dot(v) / norm() / v.norm());}

double Vector3D::tripleProduct(const Vector3D& v, const Vector3D& w) const { return dot(v.cross(w)); }

Vector3D Vector3D::rotate(const Vector3D& axis, double t) const {
	const Vector3D& x = *this;
	const Vector3D& a = ~axis;
	return x * cos(t) + a * x.dot(a) * (1-cos(t)) +  a.cross(x) * sin(t);
}

bool Vector3D::ae(const Vector3D& u, const Vector3D& v, double epsilon) {return (u - v).norm() <= epsilon;}

//c.f. header
Vector3D const Vector3D::Null = Vector3D(0.0, 0.0, 0.0);

//c.f. header
Vector3D const Vector3D::i = Vector3D(1.0, 0.0, 0.0);

//c.f. header
Vector3D const Vector3D::j = Vector3D(0.0, 1.0, 0.0);

//c.f. header
Vector3D const Vector3D::k = Vector3D(0.0, 0.0, 1.0);

//c.f. header
Vector3D operator* (double n, const Vector3D& v) {
	return v * n;
}

}