Vuo  2.3.2
VuoPoint2d.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": "2D Point",
18  "description": "A floating-point 2-dimensional Cartesian spatial location.",
19  "keywords": [ "coordinate" ],
20  "version": "1.0.0",
21  "dependencies": [
22  "VuoList_VuoPoint2d",
23  "VuoReal",
24  "VuoText",
25  ],
26 });
27 #endif
29 
42 {
43  VuoPoint2d point = {0,0};
44 
45  json_type t = json_object_get_type(js);
46  if (t == json_type_string)
47  {
48  const char *s = json_object_get_string(js);
49  float x, y;
50  sscanf(s, "%20g, %20g", &x, &y);
51  return (VuoPoint2d){x, y};
52  }
53  else if (t == json_type_array)
54  {
55  int len = json_object_array_length(js);
56  if (len >= 1)
57  point.x = json_object_get_double(json_object_array_get_idx(js, 0));
58  if (len >= 2)
59  point.y = json_object_get_double(json_object_array_get_idx(js, 1));
60  return point;
61  }
62 
63  json_object *o = NULL;
64 
65  if (json_object_object_get_ex(js, "x", &o))
66  point.x = VuoReal_makeFromJson(o);
67  else if (json_object_object_get_ex(js, "X", &o))
68  point.x = VuoReal_makeFromJson(o);
69 
70  if (json_object_object_get_ex(js, "y", &o))
71  point.y = VuoReal_makeFromJson(o);
72  else if (json_object_object_get_ex(js, "Y", &o))
73  point.y = VuoReal_makeFromJson(o);
74 
75  return point;
76 }
77 
82 json_object * VuoPoint2d_getJson(const VuoPoint2d value)
83 {
84  json_object *js = json_object_new_object();
85 
86  json_object *xObject = VuoReal_getJson(value.x);
87  json_object_object_add(js, "x", xObject);
88 
89  json_object *yObject = VuoReal_getJson(value.y);
90  json_object_object_add(js, "y", yObject);
91 
92  return js;
93 }
94 
99 char * VuoPoint2d_getSummary(const VuoPoint2d value)
100 {
101  return VuoText_format("%g, %g", value.x, value.y);
102 }
103 
107 bool VuoPoint2d_areEqual(const VuoPoint2d value1, const VuoPoint2d value2)
108 {
109  return fabs(value1.x - value2.x) < 0.00001
110  && fabs(value1.y - value2.y) < 0.00001;
111 }
112 
117 {
118  unsigned long count = VuoListGetCount_VuoPoint2d(values);
119  if (count <= 1)
120  return true;
121 
122  VuoPoint2d *points = VuoListGetData_VuoPoint2d(values);
123  VuoPoint2d min, max;
124  min = max = points[0];
125  for (unsigned long i = 1; i < count; ++i)
126  {
127  min = VuoPoint2d_min(min, points[i]);
128  max = VuoPoint2d_max(max, points[i]);
129  }
130  VuoPoint2d diff = max - min;
131  return diff.x <= tolerance.x
132  && diff.y <= tolerance.y;
133 }
134 
141 bool VuoPoint2d_isLessThan(const VuoPoint2d a, const VuoPoint2d b)
142 {
145  return false;
146 }
147 
151 bool VuoPoint2d_isWithinRange(VuoPoint2d value, VuoPoint2d minimum, VuoPoint2d maximum)
152 {
153  return minimum.x <= value.x && value.x <= maximum.x
154  && minimum.y <= value.y && value.y <= maximum.y;
155 }
156 
160 VuoPoint2d VuoPoint2d_minList(VuoList_VuoPoint2d values, VuoInteger *outputPosition)
161 {
162  unsigned long count = VuoListGetCount_VuoPoint2d(values);
163  if (count == 0)
164  {
165  *outputPosition = 0;
166  return 0;
167  }
168 
169  VuoPoint2d *points = VuoListGetData_VuoPoint2d(values);
170  VuoPoint2d min = FLT_MAX;
171  for (unsigned long i = 0; i < count; ++i)
172  if (VuoPoint2d_isLessThan(points[i], min))
173  {
174  min = points[i];
175  *outputPosition = i + 1;
176  }
177 
178  return min;
179 }
180 
184 VuoPoint2d VuoPoint2d_maxList(VuoList_VuoPoint2d values, VuoInteger *outputPosition)
185 {
186  unsigned long count = VuoListGetCount_VuoPoint2d(values);
187  if (count == 0)
188  {
189  *outputPosition = 0;
190  return 0;
191  }
192 
193  VuoPoint2d *points = VuoListGetData_VuoPoint2d(values);
194  VuoPoint2d max = -FLT_MAX;
195  for (unsigned long i = 0; i < count; ++i)
196  if (VuoPoint2d_isLessThan(max, points[i]))
197  {
198  max = points[i];
199  *outputPosition = i + 1;
200  }
201 
202  return max;
203 }
204 
209 {
210  VuoInteger count = VuoListGetCount_VuoPoint2d(values);
211  if (count == 0)
212  return 0;
213 
214  VuoPoint2d sum = 0;
215  for (VuoInteger i = 1; i <= count; ++i)
216  sum += VuoListGetValue_VuoPoint2d(values, i);
217 
218  VuoPoint2d divisor = count;
219  return sum / divisor;
220 }
221 
227 VuoPoint2d VuoPoint2d_random(const VuoPoint2d minimum, const VuoPoint2d maximum)
228 {
229  return VuoPoint2d_make(
230  VuoReal_random(minimum.x, maximum.x),
231  VuoReal_random(minimum.y, maximum.y));
232 }
233 
239 VuoPoint2d VuoPoint2d_randomWithState(unsigned short state[3], const VuoPoint2d minimum, const VuoPoint2d maximum)
240 {
241  return VuoPoint2d_make(
242  VuoReal_randomWithState(state, minimum.x, maximum.x),
243  VuoReal_randomWithState(state, minimum.y, maximum.y));
244 }