Vuo  2.3.2
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 
34 typedef const struct VuoList_VuoPoint2d_struct { void *l; } * VuoList_VuoPoint2d;
35 #define VuoList_VuoPoint2d_TYPE_DEFINED
37 
38 VuoPoint2d VuoPoint2d_makeFromJson(struct json_object * js);
39 struct json_object * VuoPoint2d_getJson(const VuoPoint2d value);
40 char * VuoPoint2d_getSummary(const VuoPoint2d value);
41 
42 #define VuoPoint2d_SUPPORTS_COMPARISON
43 bool VuoPoint2d_areEqual(const VuoPoint2d value1, const VuoPoint2d value2);
44 bool VuoPoint2d_areEqualListWithinTolerance(VuoList_VuoPoint2d values, VuoPoint2d tolerance);
45 bool VuoPoint2d_isLessThan(const VuoPoint2d a, const VuoPoint2d b);
46 bool VuoPoint2d_isWithinRange(VuoPoint2d value, VuoPoint2d minimum, VuoPoint2d maximum);
47 
48 VuoPoint2d VuoPoint2d_minList(VuoList_VuoPoint2d values, VuoInteger *outputPosition);
49 VuoPoint2d VuoPoint2d_maxList(VuoList_VuoPoint2d values, VuoInteger *outputPosition);
50 VuoPoint2d VuoPoint2d_average(VuoList_VuoPoint2d values);
51 
52 VuoPoint2d VuoPoint2d_random(const VuoPoint2d minimum, const VuoPoint2d maximum);
53 VuoPoint2d VuoPoint2d_randomWithState(unsigned short state[3], const VuoPoint2d minimum, const VuoPoint2d maximum);
54 
56 
59 VuoPoint2d VuoPoint2d_makeFromString(const char *str);
60 char * VuoPoint2d_getString(const VuoPoint2d value);
61 void VuoPoint2d_retain(VuoPoint2d value);
62 void VuoPoint2d_release(VuoPoint2d value);
64 
70 static inline VuoPoint2d VuoPoint2d_make(float x, float y) __attribute__((const));
71 static inline VuoPoint2d VuoPoint2d_make(float x, float y)
72 {
73  return (VuoPoint2d){x, y};
74 }
75 
81 static inline VuoPoint2d VuoPoint2d_makeFromArray(float *f)
82 {
83  return (VuoPoint2d){ f[0], f[1] };
84 }
85 
89 static inline void VuoPoint2d_setArray(float *f, VuoPoint2d p)
90 {
91  f[0] = p.x;
92  f[1] = p.y;
93 }
94 
98 static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
99 static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b)
100 {
101  return a + b;
102 }
103 
107 static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
108 static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b)
109 {
110  return a - b;
111 }
112 
113 
117 static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a) __attribute__((const));
118 static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a)
119 {
120  return (a.x*a.x + a.y*a.y);
121 }
122 
126 static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
127 static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b)
128 {
129  return a / b;
130 }
131 
135 static inline VuoPoint2d VuoPoint2d_makeNonzero(VuoPoint2d a) __attribute__((const));
136 static inline VuoPoint2d VuoPoint2d_makeNonzero(VuoPoint2d a)
137 {
138  if (fabs(a.x) < 0.000001)
139  a.x = copysign(0.000001, a.x);
140  if (fabs(a.y) < 0.000001)
141  a.y = copysign(0.000001, a.y);
142  return a;
143 }
144 
148 static inline float VuoPoint2d_magnitude(VuoPoint2d a) __attribute__((const));
149 static inline float VuoPoint2d_magnitude(VuoPoint2d a)
150 {
151  return sqrtf(a.x*a.x + a.y*a.y);
152 }
153 
157 static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a) __attribute__((const));
158 static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a)
159 {
160  return a / sqrtf(a.x * a.x + a.y * a.y);
161 }
162 
166 static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b) __attribute__((const));
167 static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b)
168 {
169  return a * b;
170 }
171 
175 static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v) __attribute__((const));
176 static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v)
177 {
178  return u.x*v.x+u.y*v.y;
179 }
180 
184 static inline float VuoPoint2d_distance(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
185 static inline float VuoPoint2d_distance(VuoPoint2d a, VuoPoint2d b)
186 {
187  return sqrtf( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
188 }
189 
193 static inline VuoPoint2d VuoPoint2d_min(const VuoPoint2d l, const VuoPoint2d r) __attribute__((const));
194 static inline VuoPoint2d VuoPoint2d_min(const VuoPoint2d l, const VuoPoint2d r)
195 {
196  return (VuoPoint2d){
197  fminf(l.x, r.x),
198  fminf(l.y, r.y)};
199 }
200 
204 static inline VuoPoint2d VuoPoint2d_max(const VuoPoint2d l, const VuoPoint2d r) __attribute__((const));
205 static inline VuoPoint2d VuoPoint2d_max(const VuoPoint2d l, const VuoPoint2d r)
206 {
207  return (VuoPoint2d){
208  fmaxf(l.x, r.x),
209  fmaxf(l.y, r.y)};
210 }
211 
215 static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t) __attribute__((const));
216 static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t)
217 {
218  return a * (1 - t) + b * t;
219 }
220 
224 static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
225 static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b)
226 {
227  return a * b;
228 }
229 
233 static inline VuoPoint2d VuoPoint2d_spring(VuoReal timeSinceDrop, VuoPoint2d dropPosition, VuoPoint2d restingPosition, VuoReal period, VuoReal damping)
234 {
235  return (VuoPoint2d){
236  (float)VuoReal_spring(timeSinceDrop, dropPosition.x, restingPosition.x, period, damping),
237  (float)VuoReal_spring(timeSinceDrop, dropPosition.y, restingPosition.y, period, damping)
238  };
239 }
240 
244 static inline VuoPoint2d VuoPoint2d_clamp(VuoPoint2d point, VuoReal limitA, VuoReal limitB)
245 {
246  return (VuoPoint2d){
247  (float)VuoReal_clamp(point.x, limitA, limitB),
248  (float)VuoReal_clamp(point.y, limitA, limitB)
249  };
250 }
251 
255 static inline VuoPoint2d VuoPoint2d_clampn(VuoPoint2d point, VuoPoint2d limitA, VuoPoint2d limitB)
256 {
257  return (VuoPoint2d){
258  (float)VuoReal_clamp(point.x, limitA.x, limitB.x),
259  (float)VuoReal_clamp(point.y, limitA.y, limitB.y)
260  };
261 }
262 
272 static inline VuoPoint2d VuoPoint2d_bezier3(VuoPoint2d p0, VuoPoint2d p1, VuoPoint2d p2, VuoPoint2d p3, VuoReal time)
273 {
274  return (VuoPoint2d) {
275  (float)VuoReal_bezier3(p0.x,p1.x,p2.x,p3.x,time),
276  (float)VuoReal_bezier3(p0.y,p1.y,p2.y,p3.y,time)
277  };
278 }
279 
283 static inline VuoPoint2d VuoPoint2d_snap(VuoPoint2d a, VuoPoint2d center, VuoPoint2d snap)
284 {
285  VuoPoint2d nonzeroSnap = VuoPoint2d_makeNonzero(snap);
286  return (VuoPoint2d) {
287  center.x + nonzeroSnap.x * (int)round( (a.x-center.x) / nonzeroSnap.x ),
288  center.y + nonzeroSnap.y * (int)round( (a.y-center.y) / nonzeroSnap.y )
289  };
290 }
291 
296 #ifdef __cplusplus
297 }
298 #endif