Vuo  2.3.2
VuoPoint4d.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <math.h>
13 #include "VuoPoint3d.h"
14 #include "VuoReal.h"
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
31 typedef float __attribute__((ext_vector_type(4))) VuoPoint4d;
32 
34 typedef const struct VuoList_VuoPoint4d_struct { void *l; } * VuoList_VuoPoint4d;
35 #define VuoList_VuoPoint4d_TYPE_DEFINED
37 
38 VuoPoint4d VuoPoint4d_makeFromJson(struct json_object * js);
39 struct json_object * VuoPoint4d_getJson(const VuoPoint4d value);
40 char * VuoPoint4d_getSummary(const VuoPoint4d value);
41 
42 #define VuoPoint4d_SUPPORTS_COMPARISON
43 bool VuoPoint4d_areEqual(const VuoPoint4d value1, const VuoPoint4d value2);
44 bool VuoPoint4d_areEqualListWithinTolerance(VuoList_VuoPoint4d values, VuoPoint4d tolerance);
45 bool VuoPoint4d_isLessThan(const VuoPoint4d a, const VuoPoint4d b);
46 bool VuoPoint4d_isWithinRange(VuoPoint4d value, VuoPoint4d minimum, VuoPoint4d maximum);
47 
48 VuoPoint4d VuoPoint4d_minList(VuoList_VuoPoint4d values, VuoInteger *outputPosition);
49 VuoPoint4d VuoPoint4d_maxList(VuoList_VuoPoint4d values, VuoInteger *outputPosition);
50 VuoPoint4d VuoPoint4d_average(VuoList_VuoPoint4d values);
51 
52 VuoPoint4d VuoPoint4d_random(const VuoPoint4d minimum, const VuoPoint4d maximum);
53 VuoPoint4d VuoPoint4d_randomWithState(unsigned short state[3], const VuoPoint4d minimum, const VuoPoint4d maximum);
54 
56 
59 VuoPoint4d VuoPoint4d_makeFromString(const char *str);
60 char * VuoPoint4d_getString(const VuoPoint4d value);
61 void VuoPoint4d_retain(VuoPoint4d value);
62 void VuoPoint4d_release(VuoPoint4d value);
64 
68 static inline VuoPoint4d VuoPoint4d_make(float x, float y, float z, float w) __attribute__((const));
69 static inline VuoPoint4d VuoPoint4d_make(float x, float y, float z, float w)
70 {
71  return (VuoPoint4d){x, y, z, w};
72 }
73 
79 static inline VuoPoint4d VuoPoint4d_makeFromArray(float *f)
80 {
81  return (VuoPoint4d){ f[0], f[1], f[2], f[3] };
82 }
83 
89 static inline void VuoPoint4d_setArray(float *f, VuoPoint4d p)
90 {
91  f[0] = p.x;
92  f[1] = p.y;
93  f[2] = p.z;
94  f[3] = p.w;
95 }
96 
102 static inline VuoPoint3d VuoPoint4d_to3d(VuoPoint4d p) __attribute__((const));
103 static inline VuoPoint3d VuoPoint4d_to3d(VuoPoint4d p)
104 {
105  return (VuoPoint3d){p.x, p.y, p.z};
106 }
107 
113 static inline VuoPoint4d VuoPoint3d_to4d1(VuoPoint3d p) __attribute__((const));
114 static inline VuoPoint4d VuoPoint3d_to4d1(VuoPoint3d p)
115 {
116  return (VuoPoint4d){p.x, p.y, p.z, 1};
117 }
118 
122 static inline VuoPoint4d VuoPoint4d_crossProduct(VuoPoint4d u, VuoPoint4d v) __attribute__((const));
123 static inline VuoPoint4d VuoPoint4d_crossProduct(VuoPoint4d u, VuoPoint4d v)
124 {
125  return (VuoPoint4d){
126  u.y*v.z - u.z*v.y,
127  u.z*v.x - u.x*v.z,
128  u.x*v.y - u.y*v.x,
129  1.
130  };
131 }
132 
136 static inline float VuoPoint4d_dotProduct(VuoPoint4d u, VuoPoint4d v) __attribute__((const));
137 static inline float VuoPoint4d_dotProduct(VuoPoint4d u, VuoPoint4d v)
138 {
139  return u.x*v.x + u.y*v.y + u.z*v.z + u.w*v.w;
140 }
141 
142 
146 static inline float VuoPoint4d_magnitude(VuoPoint4d a) __attribute__((const));
147 static inline float VuoPoint4d_magnitude(VuoPoint4d a)
148 {
149  return sqrtf(a.x*a.x + a.y*a.y + a.z*a.z + a.w*a.w);
150 }
151 
155 static inline VuoPoint4d VuoPoint4d_normalize3d(VuoPoint4d a) __attribute__((const));
156 static inline VuoPoint4d VuoPoint4d_normalize3d(VuoPoint4d a)
157 {
158  VuoPoint3d p = a.xyz / sqrtf(a.x * a.x + a.y * a.y + a.z * a.z);
159  return (VuoPoint4d){p.x, p.y, p.z, a.w};
160 }
161 
165 static inline VuoPoint4d VuoPoint4d_normalize(VuoPoint4d a) __attribute__((const));
166 static inline VuoPoint4d VuoPoint4d_normalize(VuoPoint4d a)
167 {
168  return a / sqrtf(a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w);
169 }
170 
174 static inline VuoPoint4d VuoPoint4d_add(VuoPoint4d a, VuoPoint4d b) __attribute__((const));
175 static inline VuoPoint4d VuoPoint4d_add(VuoPoint4d a, VuoPoint4d b)
176 {
177  return a + b;
178 }
179 
183 static inline VuoPoint4d VuoPoint4d_subtract(VuoPoint4d a, VuoPoint4d b) __attribute__((const));
184 static inline VuoPoint4d VuoPoint4d_subtract(VuoPoint4d a, VuoPoint4d b)
185 {
186  return a - b;
187 }
188 
192 static inline float VuoPoint4d_squaredMagnitude(VuoPoint4d a) __attribute__((const));
193 static inline float VuoPoint4d_squaredMagnitude(VuoPoint4d a)
194 {
195  return (a.x*a.x + a.y*a.y + a.z*a.z + a.w*a.w);
196 }
197 
198 
202 static inline VuoPoint4d VuoPoint4d_divide(VuoPoint4d a, VuoPoint4d b) __attribute__((const));
203 static inline VuoPoint4d VuoPoint4d_divide(VuoPoint4d a, VuoPoint4d b)
204 {
205  return a / b;
206 }
207 
211 static inline VuoPoint4d VuoPoint4d_multiply(VuoPoint4d a, float b) __attribute__((const));
212 static inline VuoPoint4d VuoPoint4d_multiply(VuoPoint4d a, float b)
213 {
214  return a * b;
215 }
216 
220 static inline VuoPoint4d VuoPoint4d_scale(VuoPoint4d a, VuoPoint4d b) __attribute__((const));
221 static inline VuoPoint4d VuoPoint4d_scale(VuoPoint4d a, VuoPoint4d b)
222 {
223  return a * b;
224 }
225 
229 static inline VuoPoint4d VuoPoint4d_makeNonzero(VuoPoint4d a) __attribute__((const));
230 static inline VuoPoint4d VuoPoint4d_makeNonzero(VuoPoint4d a)
231 {
232  if (fabs(a.x) < 0.000001)
233  a.x = copysign(0.000001, a.x);
234  if (fabs(a.y) < 0.000001)
235  a.y = copysign(0.000001, a.y);
236  if (fabs(a.z) < 0.000001)
237  a.z = copysign(0.000001, a.z);
238  if (fabs(a.w) < 0.000001)
239  a.w = copysign(0.000001, a.w);
240  return a;
241 }
242 
246 static inline float VuoPoint4d_distance(VuoPoint4d a, VuoPoint4d b) __attribute__((const));
247 static inline float VuoPoint4d_distance(VuoPoint4d a, VuoPoint4d b)
248 {
249  return sqrtf((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + (a.z-b.z)*(a.z-b.z) + (a.w-b.w)*(a.w-b.w));
250 }
251 
255 static inline VuoPoint4d VuoPoint4d_min(const VuoPoint4d l, const VuoPoint4d r) __attribute__((const));
256 static inline VuoPoint4d VuoPoint4d_min(const VuoPoint4d l, const VuoPoint4d r)
257 {
258  return (VuoPoint4d){
259  fminf(l.x, r.x),
260  fminf(l.y, r.y),
261  fminf(l.z, r.z),
262  fminf(l.w, r.w)};
263 }
264 
268 static inline VuoPoint4d VuoPoint4d_max(const VuoPoint4d l, const VuoPoint4d r) __attribute__((const));
269 static inline VuoPoint4d VuoPoint4d_max(const VuoPoint4d l, const VuoPoint4d r)
270 {
271  return (VuoPoint4d){
272  fmaxf(l.x, r.x),
273  fmaxf(l.y, r.y),
274  fmaxf(l.z, r.z),
275  fmaxf(l.w, r.w)};
276 }
277 
281 static inline VuoPoint4d VuoPoint4d_snap(VuoPoint4d a, VuoPoint4d center, VuoPoint4d snap) __attribute__((const));
282 static inline VuoPoint4d VuoPoint4d_snap(VuoPoint4d a, VuoPoint4d center, VuoPoint4d snap)
283 {
284  VuoPoint4d nonzeroSnap = VuoPoint4d_makeNonzero(snap);
285  return (VuoPoint4d) {
286  center.x + nonzeroSnap.x * (int)round((a.x-center.x) / nonzeroSnap.x),
287  center.y + nonzeroSnap.y * (int)round((a.y-center.y) / nonzeroSnap.y),
288  center.z + nonzeroSnap.z * (int)round((a.z-center.z) / nonzeroSnap.z),
289  center.w + nonzeroSnap.w * (int)round((a.w-center.w) / nonzeroSnap.w)
290  };
291 }
292 
293 
297 static inline VuoPoint4d VuoPoint4d_clampn(VuoPoint4d point, VuoPoint4d limitA, VuoPoint4d limitB)
298 {
299  return (VuoPoint4d){
300  (float)VuoReal_clamp(point.x, limitA.x, limitB.x),
301  (float)VuoReal_clamp(point.y, limitA.y, limitB.y),
302  (float)VuoReal_clamp(point.z, limitA.z, limitB.z),
303  (float)VuoReal_clamp(point.w, limitA.w, limitB.w)
304  };
305 }
306 
311 #ifdef __cplusplus
312 }
313 #endif