Vuo  2.3.2
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 
91 json_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 
111 char * VuoPoint3d_getSummary(const VuoPoint3d value)
112 {
113  return VuoText_format("%g, %g, %g", value.x, value.y, value.z);
114 }
115 
119 bool 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 
155 bool VuoPoint3d_isLessThan(const VuoPoint3d a, const VuoPoint3d b)
156 {
160  return false;
161 }
162 
166 bool 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 
176 VuoPoint3d 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 
200 VuoPoint3d 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 {
226  VuoInteger count = VuoListGetCount_VuoPoint3d(values);
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 
243 VuoPoint3d 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 
256 VuoPoint3d 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 }