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 
57 static inline VuoPoint2d VuoPoint2d_make(float x, float y) __attribute__((const));
58 static inline VuoPoint2d VuoPoint2d_make(float x, float y)
59 {
60  return (VuoPoint2d){x, y};
61 }
62 
66 static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
67 static inline VuoPoint2d VuoPoint2d_add(VuoPoint2d a, VuoPoint2d b)
68 {
69  return a + b;
70 }
71 
75 static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
76 static inline VuoPoint2d VuoPoint2d_subtract(VuoPoint2d a, VuoPoint2d b)
77 {
78  return a - b;
79 }
80 
81 
85 static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a) __attribute__((const));
86 static inline float VuoPoint2d_squaredMagnitude(VuoPoint2d a)
87 {
88  return (a.x*a.x + a.y*a.y);
89 }
90 
94 static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
95 static inline VuoPoint2d VuoPoint2d_divide(VuoPoint2d a, VuoPoint2d b)
96 {
97  return a / b;
98 }
99 
103 static inline VuoPoint2d VuoPoint2d_makeNonzero(VuoPoint2d a) __attribute__((const));
104 static inline VuoPoint2d VuoPoint2d_makeNonzero(VuoPoint2d a)
105 {
106  if (fabs(a.x) < 0.000001)
107  a.x = copysign(0.000001, a.x);
108  if (fabs(a.y) < 0.000001)
109  a.y = copysign(0.000001, a.y);
110  return a;
111 }
112 
116 static inline float VuoPoint2d_magnitude(VuoPoint2d a) __attribute__((const));
117 static inline float VuoPoint2d_magnitude(VuoPoint2d a)
118 {
119  return sqrtf(a.x*a.x + a.y*a.y);
120 }
121 
125 static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a) __attribute__((const));
126 static inline VuoPoint2d VuoPoint2d_normalize(VuoPoint2d a)
127 {
128  return a / sqrtf(a.x * a.x + a.y * a.y);
129 }
130 
134 static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b) __attribute__((const));
135 static inline VuoPoint2d VuoPoint2d_multiply(VuoPoint2d a, float b)
136 {
137  return a * b;
138 }
139 
143 static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v) __attribute__((const));
144 static inline float VuoPoint2d_dotProduct(VuoPoint2d u, VuoPoint2d v)
145 {
146  return u.x*v.x+u.y*v.y;
147 }
148 
152 static inline float VuoPoint2d_distance(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
153 static inline float VuoPoint2d_distance(VuoPoint2d a, VuoPoint2d b)
154 {
155  return sqrtf( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
156 }
157 
161 static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t) __attribute__((const));
162 static inline VuoPoint2d VuoPoint2d_lerp(VuoPoint2d a, VuoPoint2d b, float t)
163 {
164  return a * (1 - t) + b * t;
165 }
166 
170 static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b) __attribute__((const));
171 static inline VuoPoint2d VuoPoint2d_scale(VuoPoint2d a, VuoPoint2d b)
172 {
173  return a * b;
174 }
175 
179 static inline VuoPoint2d VuoPoint2d_spring(VuoReal timeSinceDrop, VuoPoint2d dropPosition, VuoPoint2d restingPosition, VuoReal period, VuoReal damping)
180 {
181  return (VuoPoint2d){
182  (float)VuoReal_spring(timeSinceDrop, dropPosition.x, restingPosition.x, period, damping),
183  (float)VuoReal_spring(timeSinceDrop, dropPosition.y, restingPosition.y, period, damping)
184  };
185 }
186 
190 static inline VuoPoint2d VuoPoint2d_clamp(VuoPoint2d point, VuoReal limitA, VuoReal limitB)
191 {
192  return (VuoPoint2d){
193  (float)VuoReal_clamp(point.x, limitA, limitB),
194  (float)VuoReal_clamp(point.y, limitA, limitB)
195  };
196 }
197 
201 static inline VuoPoint2d VuoPoint2d_clampn(VuoPoint2d point, VuoPoint2d limitA, VuoPoint2d limitB)
202 {
203  return (VuoPoint2d){
204  (float)VuoReal_clamp(point.x, limitA.x, limitB.x),
205  (float)VuoReal_clamp(point.y, limitA.y, limitB.y)
206  };
207 }
208 
218 static inline VuoPoint2d VuoPoint2d_bezier3(VuoPoint2d p0, VuoPoint2d p1, VuoPoint2d p2, VuoPoint2d p3, VuoReal time)
219 {
220  return (VuoPoint2d) {
221  (float)VuoReal_bezier3(p0.x,p1.x,p2.x,p3.x,time),
222  (float)VuoReal_bezier3(p0.y,p1.y,p2.y,p3.y,time)
223  };
224 }
225 
229 static inline VuoPoint2d VuoPoint2d_snap(VuoPoint2d a, VuoPoint2d center, VuoPoint2d snap)
230 {
231  VuoPoint2d nonzeroSnap = VuoPoint2d_makeNonzero(snap);
232  return (VuoPoint2d) {
233  center.x + nonzeroSnap.x * (int)round( (a.x-center.x) / nonzeroSnap.x ),
234  center.y + nonzeroSnap.y * (int)round( (a.y-center.y) / nonzeroSnap.y )
235  };
236 }
237 
242 #ifdef __cplusplus
243 }
244 #endif