Vuo  2.4.0
VuoRectangle.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" : "Rectangle",
18 "description" : "A 2-dimensional axis-aligned box.",
19 "keywords" : [
20 "coordinate",
21 "point", "size",
22 "box", "square",
23 ],
24 "version" : "1.0.0",
25 "dependencies" : [
26 "VuoPoint2d",
27 "VuoReal",
28 "VuoText"
29 ]
30});
31#endif
33
48{
49 return (VuoRectangle){
50 VuoJson_getObjectValue(VuoPoint2d, js, "center", {0,0}),
51 VuoJson_getObjectValue(VuoPoint2d, js, "size", {0,0})
52 };
53}
54
62{
63 json_object *js = json_object_new_object();
64 json_object_object_add(js, "center", VuoPoint2d_getJson(r.center));
65 json_object_object_add(js, "size", VuoPoint2d_getJson(r.size));
66 return js;
67}
68
76{
77 return VuoText_format("%g×%g @ %g,%g", r.size.x, r.size.y, r.center.x, r.center.y);
78}
79
86{
87 return VuoPoint2d_areEqual(a.center, b.center)
88 && VuoPoint2d_areEqual(a.size, b.size);
89}
90
98{
99 VuoType_returnInequality(VuoPoint2d, a.center, b.center);
100 VuoType_returnInequality(VuoPoint2d, a.size, b.size);
101 return false;
102}
103
110{
111 return p.x >= r.center.x - r.size.x/2
112 && p.x <= r.center.x + r.size.x/2
113 && p.y >= r.center.y - r.size.y/2
114 && p.y <= r.center.y + r.size.y/2;
115}
116
127{
128 float rectangleALeft = rectangleA.center.x - rectangleA.size.x/2.;
129 float rectangleARight = rectangleA.center.x + rectangleA.size.x/2.;
130 float rectangleABottom = rectangleA.center.y - rectangleA.size.y/2.;
131 float rectangleATop = rectangleA.center.y + rectangleA.size.y/2.;
132
133 float rectangleBLeft = rectangleB.center.x - rectangleB.size.x/2.;
134 float rectangleBRight = rectangleB.center.x + rectangleB.size.x/2.;
135 float rectangleBBottom = rectangleB.center.y - rectangleB.size.y/2.;
136 float rectangleBTop = rectangleB.center.y + rectangleB.size.y/2.;
137
138 float tolerance = 0.00001;
139
140 if (rectangleARight < rectangleBLeft + tolerance
141 || rectangleBRight < rectangleALeft + tolerance
142 || rectangleATop < rectangleBBottom + tolerance
143 || rectangleBTop < rectangleABottom + tolerance)
144 return (VuoRectangle){ { 0, 0 }, { 0, 0 } };
145 else
146 {
147 float intersectionLeft = MAX(rectangleALeft, rectangleBLeft);
148 float intersectionRight = MIN(rectangleARight, rectangleBRight);
149 float intersectionBottom = MAX(rectangleABottom, rectangleBBottom);
150 float intersectionTop = MIN(rectangleATop, rectangleBTop);
151
152 return (VuoRectangle){
153 { (intersectionLeft + intersectionRight) / 2.,
154 (intersectionBottom + intersectionTop) / 2. },
155 { intersectionRight - intersectionLeft,
156 intersectionTop - intersectionBottom }
157 };
158 }
159}
160
167{
168 VuoReal left = MIN(rectangleA.center.x - rectangleA.size.x / 2., rectangleB.center.x - rectangleB.size.x / 2.);
169 VuoReal right = MAX(rectangleA.center.x + rectangleA.size.x / 2., rectangleB.center.x + rectangleB.size.x / 2.);
170 VuoReal bottom = MIN(rectangleA.center.y - rectangleA.size.y / 2., rectangleB.center.y - rectangleB.size.y / 2.);
171 VuoReal top = MAX(rectangleA.center.y + rectangleA.size.y / 2., rectangleB.center.y + rectangleB.size.y / 2.);
172
173 return (VuoRectangle){
174 { (left + right) / 2.,
175 (bottom + top) / 2. },
176 { right - left,
177 top - bottom }
178 };
179}