-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvector.h
103 lines (78 loc) · 2.28 KB
/
vector.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
//
// Created by ilim on 2018/10/19.
//
#ifndef RENDERER_VECTOR_H
#define RENDERER_VECTOR_H
#include <iostream>
#include <cmath>
#include <tuple>
struct Vector3;
namespace vector3 {
double dot(const Vector3 &a, const Vector3 &b);
}
Vector3 operator/(const Vector3 &v, double k);
struct Vector3 {
double x;
double y;
double z;
Vector3(double k = 0) : x(k), y(k), z(k) {}
Vector3(double x, double y, double z) : x(x), y(y), z(z) {}
double length2() const {
return vector3::dot(*this, *this);
}
double length() const {
return std::sqrt(length2());
}
Vector3 unit() const {
return *this / length();
}
Vector3 abs() const {
return Vector3(std::abs(x), std::abs(y), std::abs(z));
}
};
Vector3 operator+(const Vector3 &a, const Vector3 &b) {
return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
}
Vector3 operator-(const Vector3 &v) {
return Vector3(-v.x, -v.y, -v.z);
}
Vector3 operator-(const Vector3 &a, const Vector3 &b) {
return a + (-b);
}
Vector3 operator*(const Vector3 &v, double k) {
return Vector3(v.x * k, v.y * k, v.z * k);
}
Vector3 operator/(const Vector3 &v, double k) {
return v * (1 / k);
}
Vector3 operator*(const Vector3 &a, const Vector3 &b) {
return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
}
bool operator==(const Vector3 &a, const Vector3 &b) {
return a.x == b.x && a.y == b.y && a.z == b.z;
}
bool operator!=(const Vector3 &a, const Vector3 &b) {
return !(a == b);
}
std::ostream &operator<<(std::ostream &os, const Vector3 &v) {
os << int(v.x) << " " << int(v.y) << " " << int(v.z) << "\n";
return os;
}
namespace vector3 {
double dot(const Vector3 &a, const Vector3 &b) {
return a.x * b.x + a.y * b.y + a.z * b.z;
}
Vector3 cross(const Vector3 &a, const Vector3 &b) {
return Vector3(
a.y * b.z - a.z * b.y,
a.z * b.x - a.x * b.z,
a.x * b.y - a.y * b.x);
}
std::tuple<Vector3, Vector3> tangent_space(const Vector3 &normal) {
Vector3 near = std::abs(normal.x) > 0.9 ? Vector3(normal.x, 1, 0) : Vector3(normal.x, 0, 0);
Vector3 u = cross(normal, near).unit();
Vector3 v = cross(u, normal).unit();
return {u, v};
}
}
#endif //RENDERER_VECTOR_H