-
Notifications
You must be signed in to change notification settings - Fork 0
/
vector.c
186 lines (143 loc) · 3.29 KB
/
vector.c
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include "../include/vector.h"
////////////////////////////////////////////////
// Vec2 Functions
////////////////////////////////////////////////
vec2_t project(vec4_t point, float factor) {
vec2_t projected = {
.x = (point.x*factor)/point.z,
.y = (point.y*factor)/point.z
};
return projected;
}
vec2_t vec2_rotate_z(vec2_t v, float angle) {
vec2_t rot = { 0, 0 };
float cos_angle = cos(angle);
float sin_angle = sin(angle);
rot.x = v.x * cos_angle - v.y * sin_angle;
rot.y = v.x * sin_angle + v.y * cos_angle;
return rot;
}
float vec2_length(vec2_t v) {
return sqrt(v.x*v.x + v.y*v.y);
}
vec2_t vec2_add(vec2_t a, vec2_t b) {
vec2_t result = {
.x = a.x + b.x,
.y = a.y + b.y
};
return result;
}
vec2_t vec2_sub(vec2_t v0, vec2_t v1) {
vec2_t result = {
.x = v0.x - v1.x,
.y = v0.y - v1.y
};
return result;
}
vec2_t vec2_mul(vec2_t v, float f) {
vec2_t result = {
.x = v.x * f,
.y = v.y * f
};
return result;
}
vec2_t vec2_div(vec2_t v, float f) {
vec2_t result = {
.x = v.x / f,
.y = v.y / f
};
return result;
}
float vec2_dot(vec2_t v0, vec2_t v1) {
return (v0.x * v1.x) + (v0.y * v1.y);
}
float vec2_cross(vec2_t v0, vec2_t v1) {
return (v0.x*v1.y) - (v0.y*v1.x);
}
/////////////////////////////////////////////////
// Vec3 Functions
////////////////////////////////////////////////
vec3_t vec3_rotate_x(vec3_t v, float angle) {
vec3_t rot = { 0, 0 };
float cos_angle = cos(angle);
float sin_angle = sin(angle);
rot.x = v.x;
rot.y = v.y * cos_angle - v.z * sin_angle;
rot.z = v.y * sin_angle + v.z * cos_angle;
return rot;
}
vec3_t vec3_rotate_y(vec3_t v, float angle) {
vec3_t rot;
float cos_angle = cos(angle);
float sin_angle = sin(angle);
rot.x = v.x * cos_angle - v.z * sin_angle;
rot.y = v.y;
rot.z = v.x * sin_angle + v.z * cos_angle;
return rot;
}
vec3_t vec3_rotate_z(vec3_t v, float angle) {
vec3_t rot = { 0, 0 };
float cos_angle = cos(angle);
float sin_angle = sin(angle);
rot.x = v.x * cos_angle - v.y * sin_angle;
rot.y = v.x * sin_angle + v.y * cos_angle;
rot.z = v.z;
return rot;
}
float vec3_length(vec3_t v) {
return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
}
vec3_t vec3_add(vec3_t a, vec3_t b) {
vec3_t result = {
.x = a.x + b.x,
.y = a.y + b.y,
.z = a.z + b.z
};
return result;
}
vec3_t vec3_sub(vec3_t a, vec3_t b) {
vec3_t result = {
.x = a.x - b.x,
.y = a.y - b.y,
.z = a.z - b.z
};
return result;
}
vec3_t vec3_mul(vec3_t v, float f) {
vec3_t result = {
.x = v.x * f,
.y = v.y * f,
.z = v.z * f
};
return result;
}
vec3_t vec3_div(vec3_t v, float f) {
vec3_t result = {
.x = v.x / f,
.y = v.y / f,
.z = v.z / f
};
return result;
}
vec3_t vec3_cross(vec3_t a, vec3_t b) {
vec3_t result = {
.x = a.y*b.z - a.z*b.y,
.y = a.x*b.z - a.z*b.x,
.z = a.x*b.y - a.y*b.x
};
return result;
}
float vec3_dot(vec3_t v0, vec3_t v1) {
return (v0.x*v1.x) + (v0.y*v1.y) + (v0.z*v1.z);
}
vec3_t vec3_from_vec4(vec4_t v) {
vec3_t result = { v.x, v.y, v.z };
return result;
}
/////////////////////////////////////////////////
// Vec4 Functions
////////////////////////////////////////////////
vec4_t vec4_from_vec3(vec3_t v) {
vec4_t result = { v.x, v.y, v.z, 1.0f };
return result;
}