Vuo  2.0.0
VuoPoint2d.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include "VuoReal.h"
13 #include <math.h>
14 #include <stdbool.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
31 typedef float __attribute__((ext_vector_type(2))) VuoPoint2d;
32 
33 VuoPoint2d VuoPoint2d_makeFromJson(struct json_object * js);
34 struct json_object * VuoPoint2d_getJson(const VuoPoint2d value);
35 char * VuoPoint2d_getSummary(const VuoPoint2d value);
36 
37 #define VuoPoint2d_SUPPORTS_COMPARISON
38 bool VuoPoint2d_areEqual(const VuoPoint2d value1, const VuoPoint2d value2);
39 bool VuoPoint2d_isLessThan(const VuoPoint2d a, const VuoPoint2d b);
40 
41 VuoPoint2d VuoPoint2d_random(const VuoPoint2d minimum, const VuoPoint2d maximum);
42 VuoPoint2d VuoPoint2d_randomWithState(unsigned short state[3], const VuoPoint2d minimum, const VuoPoint2d maximum);
43 
45 
48 VuoPoint2d VuoPoint2d_makeFromString(const char *str);
49 char * VuoPoint2d_getString(const VuoPoint2d value);
50 void VuoPoint2d_retain(VuoPoint2d value);
51 void VuoPoint2d_release(VuoPoint2d value);
53 
59 static inline VuoPoint2d VuoPoint2d_make(float x, float y) __attribute__((const));
60 static inline VuoPoint2d VuoPoint2d_make(float x, float y)
61 {
62  return (VuoPoint2d){x, y};
63 }
64 
70 static inline VuoPoint2d VuoPoint2d_makeFromArray(float *f)
71 {
72  return (VuoPoint2d){ f[0], f[1] };
73 }
74 
78 static inline void VuoPoint2d_setArray(float *f, VuoPoint2d p)
79 {
80  f[0] = p.x;
81  f[1] = p.y;
82 }
83 
87 static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
88 static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b)
89 {
90  return a + b;
91 }
92 
96 static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
97 static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b)
98 {
99  return a - b;
100 }
101 
102 
106 static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a) __attribute__((const));
107 static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a)
108 {
109  return (a.x*a.x + a.y*a.y);
110 }
111 
115 static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
116 static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b)
117 {
118  return a / b;
119 }
120 
124 static inline VuoPoint2d VuoPoint2d_makeNonzero(VuoPoint2d a) __attribute__((const));
125 static inline VuoPoint2d VuoPoint2d_makeNonzero(VuoPoint2d a)
126 {
127  if (fabs(a.x) < 0.000001)
128  a.x = copysign(0.000001, a.x);
129  if (fabs(a.y) < 0.000001)
130  a.y = copysign(0.000001, a.y);
131  return a;
132 }
133 
137 static inline float VuoPoint2d_magnitude(VuoPoint2d a) __attribute__((const));
138 static inline float VuoPoint2d_magnitude(VuoPoint2d a)
139 {
140  return sqrtf(a.x*a.x + a.y*a.y);
141 }
142 
146 static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a) __attribute__((const));
147 static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a)
148 {
149  return a / sqrtf(a.x * a.x + a.y * a.y);
150 }
151 
155 static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b) __attribute__((const));
156 static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b)
157 {
158  return a * b;
159 }
160 
164 static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v) __attribute__((const));
165 static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v)
166 {
167  return u.x*v.x+u.y*v.y;
168 }
169 
173 static inline float VuoPoint2d_distance(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
174 static inline float VuoPoint2d_distance(VuoPoint2d a, VuoPoint2d b)
175 {
176  return sqrtf( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
177 }
178 
182 static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t) __attribute__((const));
183 static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t)
184 {
185  return a * (1 - t) + b * t;
186 }
187 
191 static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
192 static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b)
193 {
194  return a * b;
195 }
196 
200 static inline VuoPoint2d VuoPoint2d_spring(VuoReal timeSinceDrop, VuoPoint2d dropPosition, VuoPoint2d restingPosition, VuoReal period, VuoReal damping)
201 {
202  return (VuoPoint2d){
203  (float)VuoReal_spring(timeSinceDrop, dropPosition.x, restingPosition.x, period, damping),
204  (float)VuoReal_spring(timeSinceDrop, dropPosition.y, restingPosition.y, period, damping)
205  };
206 }
207 
211 static inline VuoPoint2d VuoPoint2d_clamp(VuoPoint2d point, VuoReal limitA, VuoReal limitB)
212 {
213  return (VuoPoint2d){
214  (float)VuoReal_clamp(point.x, limitA, limitB),
215  (float)VuoReal_clamp(point.y, limitA, limitB)
216  };
217 }
218 
222 static inline VuoPoint2d VuoPoint2d_clampn(VuoPoint2d point, VuoPoint2d limitA, VuoPoint2d limitB)
223 {
224  return (VuoPoint2d){
225  (float)VuoReal_clamp(point.x, limitA.x, limitB.x),
226  (float)VuoReal_clamp(point.y, limitA.y, limitB.y)
227  };
228 }
229 
239 static inline VuoPoint2d VuoPoint2d_bezier3(VuoPoint2d p0, VuoPoint2d p1, VuoPoint2d p2, VuoPoint2d p3, VuoReal time)
240 {
241  return (VuoPoint2d) {
242  (float)VuoReal_bezier3(p0.x,p1.x,p2.x,p3.x,time),
243  (float)VuoReal_bezier3(p0.y,p1.y,p2.y,p3.y,time)
244  };
245 }
246 
250 static inline VuoPoint2d VuoPoint2d_snap(VuoPoint2d a, VuoPoint2d center, VuoPoint2d snap)
251 {
252  VuoPoint2d nonzeroSnap = VuoPoint2d_makeNonzero(snap);
253  return (VuoPoint2d) {
254  center.x + nonzeroSnap.x * (int)round( (a.x-center.x) / nonzeroSnap.x ),
255  center.y + nonzeroSnap.y * (int)round( (a.y-center.y) / nonzeroSnap.y )
256  };
257 }
258 
263 #ifdef __cplusplus
264 }
265 #endif