Repository navigation
Expand file tree
/
Copy pathvec234.h
More file actions
182 lines (143 loc) · 3.55 KB
/
Copy pathvec234.h
File metadata and controls
182 lines (143 loc) · 3.55 KB
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
#if defined(__cplusplus)
extern "C" {
#endif
typedef struct {
double a[2];
} vec2;
static inline vec2 cvec2(double d0, double d1) {
vec2 v; v.a[0] = d0; v.a[1] = d1; return v;
}
static inline vec2 plus2(vec2 a, vec2 b) {
vec2 v;
for(int i=0;i<2;i++) v.a[i] = a.a[i] + b.a[i];
return v;
}
static inline vec2 minus2(vec2 a, vec2 b) {
vec2 v;
for(int i=0;i<2;i++) v.a[i] = a.a[i] - b.a[i];
return v;
}
static inline double vdot2(vec2 a, vec2 b) {
double sum = 0;
for(int i=0;i<2;i++) sum += a.a[i] * b.a[i];
return sum;
}
static inline vec2 dot2(vec2 a, double d) {
vec2 v;
for(int i=0;i<2;i++) v.a[i] = a.a[i] * d;
return v;
}
static inline vec2 normalize2(vec2 v) {
double sum = 0;
for(int i=0;i<2;i++) sum += v.a[i] * v.a[i];
return dot2(v, 1.0 / (sqrt(sum) + 1e-20));
}
static inline double lengthSqu2(vec2 v) {
double sum = 0;
for(int i=0;i<2;i++) sum += v.a[i] * v.a[i];
return sum;
}
static inline double distanceSqu2(vec2 v, vec2 w) {
return lengthSqu2(minus2(v, w));
}
static inline double distance2(vec2 v, vec2 w) {
return sqrt(distanceSqu2(v, w));
}
static inline vec2 midpoint2(vec2 p0, vec2 p1) {
return dot2(plus2(p0, p1), 0.5);
}
//
typedef struct {
double a[3];
} vec3;
static inline vec3 cvec3(double d0, double d1, double d2) {
vec3 v; v.a[0] = d0; v.a[1] = d1; v.a[2] = d2; return v;
}
static inline vec3 plus3(vec3 a, vec3 b) {
vec3 v;
for(int i=0;i<3;i++) v.a[i] = a.a[i] + b.a[i];
return v;
}
static inline vec3 minus3(vec3 a, vec3 b) {
vec3 v;
for(int i=0;i<3;i++) v.a[i] = a.a[i] - b.a[i];
return v;
}
static inline double vdot3(vec3 a, vec3 b) {
double sum = 0;
for(int i=0;i<3;i++) sum += a.a[i] * b.a[i];
return sum;
}
static inline vec3 dot3(vec3 a, double d) {
vec3 v;
for(int i=0;i<3;i++) v.a[i] = a.a[i] * d;
return v;
}
static inline vec3 normalize3(vec3 v) {
double sum = 0;
for(int i=0;i<3;i++) sum += v.a[i] * v.a[i];
return dot3(v, 1.0 / (sqrt(sum) + 1e-20));
}
static inline double lengthSqu3(vec3 v) {
double sum = 0;
for(int i=0;i<3;i++) sum += v.a[i] * v.a[i];
return sum;
}
static inline double distanceSqu3(vec3 v, vec3 w) {
return lengthSqu3(minus3(v, w));
}
static inline double distance3(vec3 v, vec3 w) {
return sqrt(distanceSqu3(v, w));
}
static inline vec3 midpoint3(vec3 p0, vec3 p1) {
return dot3(plus3(p0, p1), 0.5);
}
//
typedef struct {
double a[4];
} vec4;
static inline vec4 cvec4(double d0, double d1, double d2, double d3) {
vec4 v; v.a[0] = d0; v.a[1] = d1; v.a[2] = d2; v.a[3] = d3; return v;
}
static inline vec4 plus4(vec4 a, vec4 b) {
vec4 v;
for(int i=0;i<4;i++) v.a[i] = a.a[i] + b.a[i];
return v;
}
static inline vec4 minus4(vec4 a, vec4 b) {
vec4 v;
for(int i=0;i<4;i++) v.a[i] = a.a[i] - b.a[i];
return v;
}
static inline double vdot4(vec4 a, vec4 b) {
double sum = 0;
for(int i=0;i<4;i++) sum += a.a[i] * b.a[i];
return sum;
}
static inline vec4 dot4(vec4 a, double d) {
vec4 v;
for(int i=0;i<4;i++) v.a[i] = a.a[i] * d;
return v;
}
static inline vec4 normalize4(vec4 v) {
double sum = 0;
for(int i=0;i<4;i++) sum += v.a[i] * v.a[i];
return dot4(v, 1.0 / (sqrt(sum) + 1e-20));
}
static inline double lengthSqu4(vec4 v) {
double sum = 0;
for(int i=0;i<4;i++) sum += v.a[i] * v.a[i];
return sum;
}
static inline double distanceSqu4(vec4 v, vec4 w) {
return lengthSqu4(minus4(v, w));
}
static inline double distance4(vec4 v, vec4 w) {
return sqrt(distanceSqu4(v, w));
}
static inline vec4 midpoint4(vec4 p0, vec4 p1) {
return dot4(plus4(p0, p1), 0.5);
}
#if defined(__cplusplus)
}
#endif