-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathvectors.h
167 lines (141 loc) · 2.99 KB
/
vectors.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
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
typedef struct vec2 {
double x;
double y;
} vec2;
typedef struct vec3 {
double x;
double y;
double z;
} vec3;
typedef struct vec4 {
double x;
double y;
double z;
double w;
} vec4;
double length_vec2(vec2 a) {
return sqrt(pow(a.x, 2) + pow(a.y, 2));
}
double length_vec3(vec3 a) {
return sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
}
double length_vec4(vec4 a) {
return sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2) + pow(a.w, 2));
}
void print_vec2(vec2 a) {
printf("x: %f, y: %f\n", a.x, a.y);
}
void print_vec3(vec3 a) {
printf("x: %f, y: %f, z: %f\n", a.x, a.y, a.z);
}
void print_vec4(vec4 a) {
printf("x: %f, y: %f, z: %f, w: %f\n", a.x, a.y, a.z, a.w);
}
vec2 scale_vec2(vec2 a, double b) {
vec2 result;
result.x = a.x * b;
result.y = a.y * b;
return result;
}
vec3 scale_vec3(vec3 a, double b) {
vec3 result;
result.x = a.x * b;
result.y = a.y * b;
result.z = a.z * b;
return result;
}
vec4 scale_vec4(vec4 a, double b) {
vec4 result;
result.x = a.x * b;
result.y = a.y * b;
result.z = a.z * b;
result.w = a.w * b;
return result;
}
vec2 add_vec2(vec2 a, vec2 b) {
vec2 result;
result.x = a.x + b.x;
result.y = a.y + b.y;
return result;
}
vec3 add_vec3(vec3 a, vec3 b) {
vec3 result;
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
return result;
}
vec4 add_vec4(vec4 a, vec4 b) {
vec4 result;
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
result.w = a.w + b.w;
return result;
}
vec2 subtract_vec2(vec2 a, vec2 b) {
vec2 neg_b = scale_vec2(b, -1);
return add_vec2(a, neg_b);
}
vec3 subtract_vec3(vec3 a, vec3 b) {
vec3 neg_b = scale_vec3(b, -1);
return add_vec3(a, neg_b);
}
vec4 subtract_vec4(vec4 a, vec4 b) {
vec4 neg_b = scale_vec4(b, -1);
return add_vec4(a, neg_b);
}
vec2 normalize_vec2(vec2 a) {
double length = length_vec2(a);
if (length != 0) {
a.x /= length;
a.y /= length;
}
return a;
}
vec3 normalize_vec3(vec3 a) {
double length = length_vec3(a);
if (length != 0) {
a.x /= length;
a.y /= length;
a.z /= length;
}
return a;
}
vec4 normalize_vec4(vec4 a) {
double length = length_vec4(a);
if (length != 0) {
a.x /= length;
a.y /= length;
a.z /= length;
a.w /= length;
}
return a;
}
vec2 multiply_vec2(vec2 a, vec2 b) {
a.x *= b.x;
a.y *= b.y;
return a;
}
vec3 multiply_vec3(vec3 a, vec3 b) {
a.x *= b.x;
a.y *= b.y;
a.z *= b.z;
return a;
}
vec4 multiply_vec4(vec4 a, vec4 b) {
a.x *= b.x;
a.y *= b.y;
a.z *= b.z;
a.w *= b.w;
return a;
}
double dot_product_vec2(vec2 a, vec2 b) {
return a.x * b.x + a.y * b.y;
}
double dot_product_vec3(vec3 a, vec3 b) {
return a.x * b.x + a.y * b.y + a.z * b.z;
}
double dot_product_vec4(vec4 a, vec4 b) {
return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
}