-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathvec3.h
120 lines (96 loc) · 3.55 KB
/
vec3.h
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//-------------------------------------------------------------------
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files ( the "Software" ), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall
// be included in all copies or substantial portions of the
// Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
//-------------------------------------------------------------------
//-------------------------------------------------------------------
#ifndef VEC3_H
#define VEC3_H
#include <iostream>
#ifdef min
#undef min
#endif
#ifdef max
#undef max
#endif
class vec3
{
public:
vec3();
vec3(double x, double y, double z);
private:
double data_[3];
public:
bool operator!=(const vec3 &a) const;
bool operator==(const vec3 &a) const;
bool operator<=(const vec3 &a) const;
bool operator>=(const vec3 &a) const;
bool operator<(const vec3 &a) const;
bool operator>(const vec3 &a) const;
vec3& operator=(const vec3 &a);
vec3& operator+=(const vec3 &a);
vec3& operator*=(double c);
vec3& operator/=(double c);
const double* getPtr() const { return data_; }
double& operator[](const size_t);
double operator[](const size_t) const;
double dot(const vec3 &b) const;
vec3 cross(const vec3 &b);
const double x() const { return data_[0]; }
double& x() { return data_[0]; }
void x( double b ) { data_[0] = b; }
const double y() const { return data_[1]; }
double& y() { return data_[1]; }
void y( double b ) { data_[1] = b; }
const double z() const { return data_[2]; }
double& z() { return data_[2]; }
void z( double b ) { data_[2] = b; }
static vec3 zero;
static vec3 unitX;
static vec3 unitY;
static vec3 unitZ;
static vec3 min(const vec3 &a, const vec3 &b);
static vec3 max(const vec3 &a, const vec3 &b);
static const double PI;
std::string toString() const;
friend std::ostream& operator<<(std::ostream &stream, const vec3 &v);
};
vec3 cross(const vec3 &a, const vec3 &b);
vec3 bisect(const vec3 &a, const vec3 &b);
double dot(const vec3 &a, const vec3 &b);
double length(const vec3 &a);
double lengthSquared(const vec3 &a);
double distance(const vec3 &a, const vec3 &b);
double L1(const vec3 &a);
double L2(const vec3 &a);
double clamp(double value, double min, double max);
vec3 normalize(const vec3 &v1);
vec3 normalize(const vec3 &v1, float epsilon);
double vec2polar(const vec3 &a);
double angleBetween(const vec3 &a, const vec3 &b);
double angleBetween(const vec3 &a, const vec3 &b, float epsilon);
vec3 operator+(const vec3 &a, const vec3 &b);
vec3 operator-(const vec3 &a, const vec3 &b);
vec3 operator*(const vec3 &a, double b);
vec3 operator*(double a, const vec3 &b);
vec3 operator/(const vec3 &a, double b);
#endif // VEC3_H