Vuo  2.4.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
17extern "C" {
18#endif
19
31typedef float __attribute__((ext_vector_type(2))) VuoPoint2d;
32
34typedef const struct VuoList_VuoPoint2d_struct { void *l; } * VuoList_VuoPoint2d;
35#define VuoList_VuoPoint2d_TYPE_DEFINED
37
38VuoPoint2d VuoPoint2d_makeFromJson(struct json_object * js);
39struct json_object * VuoPoint2d_getJson(const VuoPoint2d value);
40char * VuoPoint2d_getSummary(const VuoPoint2d value);
41
42#define VuoPoint2d_SUPPORTS_COMPARISON
43bool VuoPoint2d_areEqual(const VuoPoint2d value1, const VuoPoint2d value2);
44bool VuoPoint2d_areEqualListWithinTolerance(VuoList_VuoPoint2d values, VuoPoint2d tolerance);
45bool VuoPoint2d_isLessThan(const VuoPoint2d a, const VuoPoint2d b);
46bool VuoPoint2d_isWithinRange(VuoPoint2d value, VuoPoint2d minimum, VuoPoint2d maximum);
47
48VuoPoint2d VuoPoint2d_minList(VuoList_VuoPoint2d values, VuoInteger *outputPosition);
49VuoPoint2d VuoPoint2d_maxList(VuoList_VuoPoint2d values, VuoInteger *outputPosition);
50VuoPoint2d VuoPoint2d_average(VuoList_VuoPoint2d values);
51
52VuoPoint2d VuoPoint2d_random(const VuoPoint2d minimum, const VuoPoint2d maximum);
53VuoPoint2d VuoPoint2d_randomWithState(unsigned short state[3], const VuoPoint2d minimum, const VuoPoint2d maximum);
54
56
59VuoPoint2d VuoPoint2d_makeFromString(const char *str);
60char * VuoPoint2d_getString(const VuoPoint2d value);
61void VuoPoint2d_retain(VuoPoint2d value);
62void VuoPoint2d_release(VuoPoint2d value);
64
70static inline VuoPoint2d VuoPoint2d_make(float x, float y) __attribute__((const));
71static inline VuoPoint2d VuoPoint2d_make(float x, float y)
72{
73 return (VuoPoint2d){x, y};
74}
75
81static inline VuoPoint2d VuoPoint2d_makeFromArray(float *f)
82{
83 return (VuoPoint2d){ f[0], f[1] };
84}
85
89static inline void VuoPoint2d_setArray(float *f, VuoPoint2d p)
90{
91 f[0] = p.x;
92 f[1] = p.y;
93}
94
98static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
99static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b)
100{
101 return a + b;
102}
103
107static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
108static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b)
109{
110 return a - b;
111}
112
113
117static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a) __attribute__((const));
118static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a)
119{
120 return (a.x*a.x + a.y*a.y);
121}
122
126static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
127static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b)
128{
129 return a / b;
130}
131
135static inline VuoPoint2d VuoPoint2d_makeNonzero(VuoPoint2d a) __attribute__((const));
136static 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
148static inline float VuoPoint2d_magnitude(VuoPoint2d a) __attribute__((const));
149static inline float VuoPoint2d_magnitude(VuoPoint2d a)
150{
151 return sqrtf(a.x*a.x + a.y*a.y);
152}
153
157static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a) __attribute__((const));
158static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a)
159{
160 return a / sqrtf(a.x * a.x + a.y * a.y);
161}
162
166static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b) __attribute__((const));
167static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b)
168{
169 return a * b;
170}
171
175static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v) __attribute__((const));
176static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v)
177{
178 return u.x*v.x+u.y*v.y;
179}
180
184static inline float VuoPoint2d_distance(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
185static 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
193static inline VuoPoint2d VuoPoint2d_min(const VuoPoint2d l, const VuoPoint2d r) __attribute__((const));
194static 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
204static inline VuoPoint2d VuoPoint2d_max(const VuoPoint2d l, const VuoPoint2d r) __attribute__((const));
205static 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
215static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t) __attribute__((const));
216static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t)
217{
218 return a * (1 - t) + b * t;
219}
220
224static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
225static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b)
226{
227 return a * b;
228}
229
233static 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
244static 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
255static 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
272static 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
283static 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