Vuo 2.4.4
Loading...
Searching...
No Matches
VuoPoint2d.c
Go to the documentation of this file.
1
10#include <float.h>
11#include <stdio.h>
12#include <stdlib.h>
13#include "VuoPoint2d.h"
14#include "VuoText.h"
15
17#ifdef VUO_COMPILER
19 "title": "2D Point",
20 "description": "A floating-point 2-dimensional Cartesian spatial location.",
21 "keywords": [ "coordinate" ],
22 "version": "1.0.0",
23 "dependencies": [
24 "VuoList_VuoPoint2d",
25 "VuoReal",
26 "VuoText",
27 ],
28});
29#endif
31
43VuoPoint2d VuoPoint2d_makeFromJson(json_object * js)
44{
45 VuoPoint2d point = {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;
52 sscanf(s, "%20g, %20g", &x, &y);
53 return (VuoPoint2d){x, y};
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 return point;
63 }
64
65 json_object *o = NULL;
66
67 if (json_object_object_get_ex(js, "x", &o))
68 point.x = VuoReal_makeFromJson(o);
69 else if (json_object_object_get_ex(js, "X", &o))
70 point.x = VuoReal_makeFromJson(o);
71
72 if (json_object_object_get_ex(js, "y", &o))
73 point.y = VuoReal_makeFromJson(o);
74 else if (json_object_object_get_ex(js, "Y", &o))
75 point.y = VuoReal_makeFromJson(o);
76
77 return point;
78}
79
84json_object * VuoPoint2d_getJson(const VuoPoint2d value)
85{
86 json_object *js = json_object_new_object();
87
88 json_object *xObject = VuoReal_getJson(value.x);
89 json_object_object_add(js, "x", xObject);
90
91 json_object *yObject = VuoReal_getJson(value.y);
92 json_object_object_add(js, "y", yObject);
93
94 return js;
95}
96
101char * VuoPoint2d_getSummary(const VuoPoint2d value)
102{
103 return VuoText_format("%g, %g", value.x, value.y);
104}
105
109bool VuoPoint2d_areEqual(const VuoPoint2d value1, const VuoPoint2d value2)
110{
111 return fabs(value1.x - value2.x) < 0.00001
112 && fabs(value1.y - value2.y) < 0.00001;
113}
114
119{
120 unsigned long count = VuoListGetCount_VuoPoint2d(values);
121 if (count <= 1)
122 return true;
123
124 VuoPoint2d *points = VuoListGetData_VuoPoint2d(values);
125 VuoPoint2d min, max;
126 min = max = points[0];
127 for (unsigned long i = 1; i < count; ++i)
128 {
129 min = VuoPoint2d_min(min, points[i]);
130 max = VuoPoint2d_max(max, points[i]);
131 }
132 VuoPoint2d diff = max - min;
133 return diff.x <= tolerance.x
134 && diff.y <= tolerance.y;
135}
136
143bool VuoPoint2d_isLessThan(const VuoPoint2d a, const VuoPoint2d b)
144{
147 return false;
148}
149
153bool VuoPoint2d_isWithinRange(VuoPoint2d value, VuoPoint2d minimum, VuoPoint2d maximum)
154{
155 return minimum.x <= value.x && value.x <= maximum.x
156 && minimum.y <= value.y && value.y <= maximum.y;
157}
158
162VuoPoint2d VuoPoint2d_minList(VuoList_VuoPoint2d values, VuoInteger *outputPosition)
163{
164 unsigned long count = VuoListGetCount_VuoPoint2d(values);
165 if (count == 0)
166 {
167 *outputPosition = 0;
168 return 0;
169 }
170
171 VuoPoint2d *points = VuoListGetData_VuoPoint2d(values);
172 VuoPoint2d min = FLT_MAX;
173 for (unsigned long i = 0; i < count; ++i)
174 if (VuoPoint2d_isLessThan(points[i], min))
175 {
176 min = points[i];
177 *outputPosition = i + 1;
178 }
179
180 return min;
181}
182
186VuoPoint2d VuoPoint2d_maxList(VuoList_VuoPoint2d values, VuoInteger *outputPosition)
187{
188 unsigned long count = VuoListGetCount_VuoPoint2d(values);
189 if (count == 0)
190 {
191 *outputPosition = 0;
192 return 0;
193 }
194
195 VuoPoint2d *points = VuoListGetData_VuoPoint2d(values);
196 VuoPoint2d max = -FLT_MAX;
197 for (unsigned long i = 0; i < count; ++i)
198 if (VuoPoint2d_isLessThan(max, points[i]))
199 {
200 max = points[i];
201 *outputPosition = i + 1;
202 }
203
204 return max;
205}
206
211{
213 if (count == 0)
214 return 0;
215
216 VuoPoint2d sum = 0;
217 for (VuoInteger i = 1; i <= count; ++i)
218 sum += VuoListGetValue_VuoPoint2d(values, i);
219
220 VuoPoint2d divisor = count;
221 return sum / divisor;
222}
223
229VuoPoint2d VuoPoint2d_random(const VuoPoint2d minimum, const VuoPoint2d maximum)
230{
231 return VuoPoint2d_make(
232 VuoReal_random(minimum.x, maximum.x),
233 VuoReal_random(minimum.y, maximum.y));
234}
235
241VuoPoint2d VuoPoint2d_randomWithState(unsigned short state[3], const VuoPoint2d minimum, const VuoPoint2d maximum)
242{
243 return VuoPoint2d_make(
244 VuoReal_randomWithState(state, minimum.x, maximum.x),
245 VuoReal_randomWithState(state, minimum.y, maximum.y));
246}