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