Vuo  2.4.0
VuoPoint3d.c
Go to the documentation of this file.
1
10#include <stdio.h>
11#include <stdlib.h>
12#include "type.h"
13
15#ifdef VUO_COMPILER
17 "title": "3D Point",
18 "description": "A floating-point 3-dimensional Cartesian spatial location.",
19 "keywords": [ "coordinate" ],
20 "version": "1.0.0",
21 "dependencies": [
22 "VuoList_VuoPoint3d",
23 "VuoBoolean",
24 "VuoReal",
25 "VuoText",
26 ],
27});
28#endif
30
44{
45 VuoPoint3d point = {0,0,0};
46
47 json_type t = json_object_get_type(js);
48 if (t == json_type_string)
49 {
50 const char *s = json_object_get_string(js);
51 float x, y, z;
52 sscanf(s, "%20g, %20g, %20g", &x, &y, &z);
53 return (VuoPoint3d){x, y, z};
54 }
55 else if (t == json_type_array)
56 {
57 int len = json_object_array_length(js);
58 if (len >= 1)
59 point.x = json_object_get_double(json_object_array_get_idx(js, 0));
60 if (len >= 2)
61 point.y = json_object_get_double(json_object_array_get_idx(js, 1));
62 if (len >= 3)
63 point.z = json_object_get_double(json_object_array_get_idx(js, 2));
64 return point;
65 }
66
67 json_object *o = NULL;
68
69 if (json_object_object_get_ex(js, "x", &o))
70 point.x = json_object_get_double(o);
71 else if (json_object_object_get_ex(js, "X", &o))
72 point.x = json_object_get_double(o);
73
74 if (json_object_object_get_ex(js, "y", &o))
75 point.y = json_object_get_double(o);
76 else if (json_object_object_get_ex(js, "Y", &o))
77 point.y = json_object_get_double(o);
78
79 if (json_object_object_get_ex(js, "z", &o))
80 point.z = json_object_get_double(o);
81 else if (json_object_object_get_ex(js, "Z", &o))
82 point.z = json_object_get_double(o);
83
84 return point;
85}
86
91json_object * VuoPoint3d_getJson(const VuoPoint3d value)
92{
93 json_object *js = json_object_new_object();
94
95 json_object *xObject = json_object_new_double(value.x);
96 json_object_object_add(js, "x", xObject);
97
98 json_object *yObject = json_object_new_double(value.y);
99 json_object_object_add(js, "y", yObject);
100
101 json_object *zObject = json_object_new_double(value.z);
102 json_object_object_add(js, "z", zObject);
103
104 return js;
105}
106
111char * VuoPoint3d_getSummary(const VuoPoint3d value)
112{
113 return VuoText_format("%g, %g, %g", value.x, value.y, value.z);
114}
115
119bool VuoPoint3d_areEqual(const VuoPoint3d value1, const VuoPoint3d value2)
120{
121 return VuoReal_areEqual(value1.x, value2.x)
122 && VuoReal_areEqual(value1.y, value2.y)
123 && VuoReal_areEqual(value1.z, value2.z);
124}
125
130{
131 unsigned long count = VuoListGetCount_VuoPoint3d(values);
132 if (count <= 1)
133 return true;
134
135 VuoPoint3d *points = VuoListGetData_VuoPoint3d(values);
136 VuoPoint3d min, max;
137 min = max = points[0];
138 for (unsigned long i = 1; i < count; ++i)
139 {
140 min = VuoPoint3d_min(min, points[i]);
141 max = VuoPoint3d_max(max, points[i]);
142 }
143 VuoPoint3d diff = max - min;
144 return diff.x <= tolerance.x
145 && diff.y <= tolerance.y
146 && diff.z <= tolerance.z;
147}
148
155bool VuoPoint3d_isLessThan(const VuoPoint3d a, const VuoPoint3d b)
156{
160 return false;
161}
162
166bool VuoPoint3d_isWithinRange(VuoPoint3d value, VuoPoint3d minimum, VuoPoint3d maximum)
167{
168 return minimum.x <= value.x && value.x <= maximum.x
169 && minimum.y <= value.y && value.y <= maximum.y
170 && minimum.z <= value.z && value.z <= maximum.z;
171}
172
176VuoPoint3d VuoPoint3d_minList(VuoList_VuoPoint3d values, VuoInteger *outputPosition)
177{
178 unsigned long count = VuoListGetCount_VuoPoint3d(values);
179 if (count == 0)
180 {
181 *outputPosition = 0;
182 return 0;
183 }
184
185 VuoPoint3d *points = VuoListGetData_VuoPoint3d(values);
186 VuoPoint3d min = FLT_MAX;
187 for (unsigned long i = 0; i < count; ++i)
188 if (VuoPoint3d_isLessThan(points[i], min))
189 {
190 min = points[i];
191 *outputPosition = i + 1;
192 }
193
194 return min;
195}
196
200VuoPoint3d VuoPoint3d_maxList(VuoList_VuoPoint3d values, VuoInteger *outputPosition)
201{
202 unsigned long count = VuoListGetCount_VuoPoint3d(values);
203 if (count == 0)
204 {
205 *outputPosition = 0;
206 return 0;
207 }
208
209 VuoPoint3d *points = VuoListGetData_VuoPoint3d(values);
210 VuoPoint3d max = -FLT_MAX;
211 for (unsigned long i = 0; i < count; ++i)
212 if (VuoPoint3d_isLessThan(max, points[i]))
213 {
214 max = points[i];
215 *outputPosition = i + 1;
216 }
217
218 return max;
219}
220
225{
227 if (count == 0)
228 return 0;
229
230 VuoPoint3d sum = 0;
231 for (VuoInteger i = 1; i <= count; ++i)
232 sum += VuoListGetValue_VuoPoint3d(values, i);
233
234 VuoPoint3d divisor = count;
235 return sum / divisor;
236}
237
243VuoPoint3d VuoPoint3d_random(const VuoPoint3d minimum, const VuoPoint3d maximum)
244{
245 return VuoPoint3d_make(
246 VuoReal_random(minimum.x, maximum.x),
247 VuoReal_random(minimum.y, maximum.y),
248 VuoReal_random(minimum.z, maximum.z));
249}
250
256VuoPoint3d VuoPoint3d_randomWithState(unsigned short state[3], const VuoPoint3d minimum, const VuoPoint3d maximum)
257{
258 return VuoPoint3d_make(
259 VuoReal_randomWithState(state, minimum.x, maximum.x),
260 VuoReal_randomWithState(state, minimum.y, maximum.y),
261 VuoReal_randomWithState(state, minimum.z, maximum.z));
262}