File: Vector3.h

package info (click to toggle)
structure-synth 1.5.0-2
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,268 kB
  • ctags: 1,966
  • sloc: cpp: 10,209; python: 164; makefile: 71; sh: 15
file content (94 lines) | stat: -rw-r--r-- 3,348 bytes parent folder | download | duplicates (9)
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
#pragma once

#include <QString>
#include <QVector>
#include <QStringList>
#include <cmath>


namespace SyntopiaCore {
	namespace Math {	

		/// A simple class for representing three-dimensional vectors.
		template <class scalar> class Vector3 {
		public:
			Vector3() { s[0] = 0; s[1] = 0; s[2] = 0;}
			Vector3(scalar x, scalar y, scalar z) { s[0] = x; s[1] = y; s[2] = z; }

			// Constructor. Parses input such as "[1 2 3]";
			Vector3(QString input, bool& succes2) {
				input.remove('[');
				input.remove(']');

				QStringList sl = input.split(" ");
				if (sl.size() != 3) { succes2 = false; return; }

				bool succes = false;
				float f;
				f = sl[0].toFloat(&succes); if (!succes)  { succes2 = false; return; }; s[0] = f;
				f = sl[1].toFloat(&succes); if (!succes)  { succes2 = false; return; }; s[1] = f;
				f = sl[2].toFloat(&succes); if (!succes)  { succes2 = false; return; }; s[2] = f;

				succes2 = true;
			}

		
			// data access
			scalar x() const { return s[0]; }
			scalar y() const { return s[1]; };
			scalar z() const { return s[2]; };
			scalar& x() { return s[0]; }
			scalar& y() { return s[1]; };
			scalar& z() { return s[2]; };
			scalar operator[] (int index) const { return s[index]; };
			scalar& operator[] (int index) { return s[index]; };

			scalar sqrLength() const { return s[0]*s[0]+s[1]*s[1]+s[2]*s[2]; }
			scalar length() const { return sqrt(s[0]*s[0]+s[1]*s[1]+s[2]*s[2]); }

			Vector3<scalar> normalized() const { scalar l = 1.0/length(); return Vector3<scalar>(s[0]*l,s[1]*l,s[2]*l); }
			void normalize() { scalar l = 1.0/length(); s[0]*=l; s[1]*=l; s[2]*=l; }
			Vector3<scalar> operator- (const Vector3<scalar>& rhs) const { return Vector3<scalar>(s[0]-rhs.s[0], s[1]-rhs.s[1], s[2]-rhs.s[2]); }
			Vector3<scalar> operator+ (const Vector3<scalar>& rhs) const { return Vector3<scalar>(s[0]+rhs.s[0], s[1]+rhs.s[1], s[2]+rhs.s[2]); }
			Vector3<scalar> operator- () const { return Vector3<scalar>(-s[0], -s[1], -s[2]); }
			bool operator== (const Vector3<scalar>& rhs) const { return (s[0]==rhs.s[0] && s[1]==rhs.s[1] && s[2]==rhs.s[2]); }
			
			Vector3<scalar> operator* (scalar rhs) const { return Vector3<scalar>(s[0]*rhs, s[1]*rhs, s[2]*rhs); }
			Vector3<scalar> operator/ (scalar rhs) const { scalar t = 1.0/rhs; return Vector3<scalar>(s[0]*t, s[1]*t, s[2]*t); }
			
			
			QString toString() const {
				return QString("[%1 %2 %3]").arg(s[0]).arg(s[1]).arg(s[2]);
			}

			Vector3<scalar> cross(const Vector3<scalar> b) const { 
				return Vector3<scalar>(
					s[1]*b.s[2] - s[2]*b.s[1] ,
					s[2]*b.s[0] - s[0]*b.s[2] ,
					s[0]*b.s[1] - s[1]*b.s[0]);
			}

			static Vector3<scalar> cross(const Vector3<scalar> a, const Vector3<scalar> b) {
				return Vector3<scalar>(
					a.s[1]*b.s[2] - a.s[2]*b.s[1] ,
					a.s[2]*b.s[0] - a.s[0]*b.s[2] ,
					a.s[0]*b.s[1] - a.s[1]*b.s[0]);
			}

			static scalar dot(const Vector3<scalar> a, const Vector3<scalar> b) { 
				return a.s[0]*b.s[0] + a.s[1]*b.s[1] + a.s[2]*b.s[2] ;
			}

		private:
			scalar s[3];
		};

		template <typename T, typename S>
		Vector3<S> operator*(T lhs, Vector3<S> rhs) { return Vector3<S>(rhs[0]*lhs, rhs[1]*lhs, rhs[2]*lhs); }
			
		typedef Vector3<float> Vector3f ;
		typedef Vector3<double> Vector3d ;

	}
}