Vuo  2.4.1
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
82json_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
99char * VuoPoint2d_getSummary(const VuoPoint2d value)
100{
101 return VuoText_format("%g, %g", value.x, value.y);
102}
103
107bool 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
141bool VuoPoint2d_isLessThan(const VuoPoint2d a, const VuoPoint2d b)
142{
145 return false;
146}
147
151bool 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
160VuoPoint2d 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
184VuoPoint2d 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{
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
227VuoPoint2d 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
239VuoPoint2d 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}