Vuo 2.4.4
Loading...
Searching...
No Matches
VuoPoint4d.c
Go to the documentation of this file.
1
10#include <float.h>
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include "VuoPoint4d.h"
15#include "VuoText.h"
16
18#ifdef VUO_COMPILER
20 "title": "4D Point",
21 "description": "A floating-point 4-dimensional Cartesian spatial location.",
22 "keywords": [ "coordinate" ],
23 "version": "1.0.0",
24 "dependencies": [
25 "VuoList_VuoPoint4d",
26 "VuoReal",
27 "VuoText",
28 ],
29});
30#endif
32
46VuoPoint4d VuoPoint4d_makeFromJson(json_object * js)
47{
48 VuoPoint4d point = {0,0,0,0};
49
50 json_type t = json_object_get_type(js);
51 if (t == json_type_string)
52 {
53 const char *s = json_object_get_string(js);
54 float x, y, z, w;
55 sscanf(s, "%20g, %20g, %20g, %20g", &x, &y, &z, &w);
56 return (VuoPoint4d){x, y, z, w};
57 }
58 else if (t == json_type_array)
59 {
60 int len = json_object_array_length(js);
61 if (len >= 1)
62 point.x = json_object_get_double(json_object_array_get_idx(js, 0));
63 if (len >= 2)
64 point.y = json_object_get_double(json_object_array_get_idx(js, 1));
65 if (len >= 3)
66 point.z = json_object_get_double(json_object_array_get_idx(js, 2));
67 if (len >= 4)
68 point.w = json_object_get_double(json_object_array_get_idx(js, 3));
69 return point;
70 }
71
72 json_object *o = NULL;
73
74 if (json_object_object_get_ex(js, "x", &o))
75 point.x = VuoReal_makeFromJson(o);
76 else if (json_object_object_get_ex(js, "X", &o))
77 point.x = VuoReal_makeFromJson(o);
78
79 if (json_object_object_get_ex(js, "y", &o))
80 point.y = VuoReal_makeFromJson(o);
81 else if (json_object_object_get_ex(js, "Y", &o))
82 point.y = VuoReal_makeFromJson(o);
83
84 if (json_object_object_get_ex(js, "z", &o))
85 point.z = VuoReal_makeFromJson(o);
86 else if (json_object_object_get_ex(js, "Z", &o))
87 point.z = VuoReal_makeFromJson(o);
88
89 if (json_object_object_get_ex(js, "w", &o))
90 point.w = VuoReal_makeFromJson(o);
91 else if (json_object_object_get_ex(js, "W", &o))
92 point.w = VuoReal_makeFromJson(o);
93
94 return point;
95}
96
101json_object * VuoPoint4d_getJson(const VuoPoint4d value)
102{
103 json_object *js = json_object_new_object();
104
105 json_object *xObject = VuoReal_getJson(value.x);
106 json_object_object_add(js, "x", xObject);
107
108 json_object *yObject = VuoReal_getJson(value.y);
109 json_object_object_add(js, "y", yObject);
110
111 json_object *zObject = VuoReal_getJson(value.z);
112 json_object_object_add(js, "z", zObject);
113
114 json_object *wObject = VuoReal_getJson(value.w);
115 json_object_object_add(js, "w", wObject);
116
117 return js;
118}
119
124char * VuoPoint4d_getSummary(const VuoPoint4d value)
125{
126 return VuoText_format("%g, %g, %g, %g", value.x, value.y, value.z, value.w);
127}
128
132bool VuoPoint4d_areEqual(const VuoPoint4d value1, const VuoPoint4d value2)
133{
134 return VuoReal_areEqual(value1.x, value2.x)
135 && VuoReal_areEqual(value1.y, value2.y)
136 && VuoReal_areEqual(value1.z, value2.z)
137 && VuoReal_areEqual(value1.w, value2.w);
138}
139
144{
145 unsigned long count = VuoListGetCount_VuoPoint4d(values);
146 if (count <= 1)
147 return true;
148
149 VuoPoint4d *points = VuoListGetData_VuoPoint4d(values);
150 VuoPoint4d min, max;
151 min = max = points[0];
152 for (unsigned long i = 1; i < count; ++i)
153 {
154 min = VuoPoint4d_min(min, points[i]);
155 max = VuoPoint4d_max(max, points[i]);
156 }
157 VuoPoint4d diff = max - min;
158 return diff.x <= tolerance.x
159 && diff.y <= tolerance.y
160 && diff.z <= tolerance.z
161 && diff.w <= tolerance.w;
162}
163
171bool VuoPoint4d_isLessThan(const VuoPoint4d a, const VuoPoint4d b)
172{
177 return false;
178}
179
183bool VuoPoint4d_isWithinRange(VuoPoint4d value, VuoPoint4d minimum, VuoPoint4d maximum)
184{
185 return minimum.x <= value.x && value.x <= maximum.x
186 && minimum.y <= value.y && value.y <= maximum.y
187 && minimum.z <= value.z && value.z <= maximum.z
188 && minimum.w <= value.w && value.w <= maximum.w;
189}
190
194VuoPoint4d VuoPoint4d_minList(VuoList_VuoPoint4d values, VuoInteger *outputPosition)
195{
196 unsigned long count = VuoListGetCount_VuoPoint4d(values);
197 if (count == 0)
198 {
199 *outputPosition = 0;
200 return 0;
201 }
202
203 VuoPoint4d *points = VuoListGetData_VuoPoint4d(values);
204 VuoPoint4d min = FLT_MAX;
205 for (unsigned long i = 0; i < count; ++i)
206 if (VuoPoint4d_isLessThan(points[i], min))
207 {
208 min = points[i];
209 *outputPosition = i + 1;
210 }
211
212 return min;
213}
214
218VuoPoint4d VuoPoint4d_maxList(VuoList_VuoPoint4d values, VuoInteger *outputPosition)
219{
220 unsigned long count = VuoListGetCount_VuoPoint4d(values);
221 if (count == 0)
222 {
223 *outputPosition = 0;
224 return 0;
225 }
226
227 VuoPoint4d *points = VuoListGetData_VuoPoint4d(values);
228 VuoPoint4d max = -FLT_MAX;
229 for (unsigned long i = 0; i < count; ++i)
230 if (VuoPoint4d_isLessThan(max, points[i]))
231 {
232 max = points[i];
233 *outputPosition = i + 1;
234 }
235
236 return max;
237}
238
243{
245 if (count == 0)
246 return 0;
247
248 VuoPoint4d sum = 0;
249 for (VuoInteger i = 1; i <= count; ++i)
250 sum += VuoListGetValue_VuoPoint4d(values, i);
251
252 VuoPoint4d divisor = count;
253 return sum / divisor;
254}
255
261VuoPoint4d VuoPoint4d_random(const VuoPoint4d minimum, const VuoPoint4d maximum)
262{
263 return VuoPoint4d_make(
264 VuoReal_random(minimum.x, maximum.x),
265 VuoReal_random(minimum.y, maximum.y),
266 VuoReal_random(minimum.z, maximum.z),
267 VuoReal_random(minimum.w, maximum.w));
268}
269
275VuoPoint4d VuoPoint4d_randomWithState(unsigned short state[3], const VuoPoint4d minimum, const VuoPoint4d maximum)
276{
277 return VuoPoint4d_make(
278 VuoReal_randomWithState(state, minimum.x, maximum.x),
279 VuoReal_randomWithState(state, minimum.y, maximum.y),
280 VuoReal_randomWithState(state, minimum.z, maximum.z),
281 VuoReal_randomWithState(state, minimum.w, maximum.w));
282}