Vuo 2.4.4
Loading...
Searching...
No Matches
VuoRectangle.c
Go to the documentation of this file.
1
10#include <stdio.h>
11#include <stdlib.h>
12#include "VuoRectangle.h"
13#include "VuoText.h"
14
16#ifdef VUO_COMPILER
18 "title" : "Rectangle",
19 "description" : "A 2-dimensional axis-aligned box.",
20 "keywords" : [
21 "coordinate",
22 "point", "size",
23 "box", "square",
24 ],
25 "version" : "1.0.0",
26 "dependencies" : [
27 "VuoPoint2d",
28 "VuoReal",
29 "VuoText"
30 ]
31});
32#endif
34
49{
50 return (VuoRectangle){
51 VuoJson_getObjectValue(VuoPoint2d, js, "center", {0,0}),
52 VuoJson_getObjectValue(VuoPoint2d, js, "size", {0,0})
53 };
54}
55
63{
64 json_object *js = json_object_new_object();
65 json_object_object_add(js, "center", VuoPoint2d_getJson(r.center));
66 json_object_object_add(js, "size", VuoPoint2d_getJson(r.size));
67 return js;
68}
69
77{
78 return VuoText_format("%g×%g @ %g,%g", r.size.x, r.size.y, r.center.x, r.center.y);
79}
80
87{
88 return VuoPoint2d_areEqual(a.center, b.center)
89 && VuoPoint2d_areEqual(a.size, b.size);
90}
91
99{
100 VuoType_returnInequality(VuoPoint2d, a.center, b.center);
101 VuoType_returnInequality(VuoPoint2d, a.size, b.size);
102 return false;
103}
104
111{
112 return p.x >= r.center.x - r.size.x/2
113 && p.x <= r.center.x + r.size.x/2
114 && p.y >= r.center.y - r.size.y/2
115 && p.y <= r.center.y + r.size.y/2;
116}
117
128{
129 float rectangleALeft = rectangleA.center.x - rectangleA.size.x/2.;
130 float rectangleARight = rectangleA.center.x + rectangleA.size.x/2.;
131 float rectangleABottom = rectangleA.center.y - rectangleA.size.y/2.;
132 float rectangleATop = rectangleA.center.y + rectangleA.size.y/2.;
133
134 float rectangleBLeft = rectangleB.center.x - rectangleB.size.x/2.;
135 float rectangleBRight = rectangleB.center.x + rectangleB.size.x/2.;
136 float rectangleBBottom = rectangleB.center.y - rectangleB.size.y/2.;
137 float rectangleBTop = rectangleB.center.y + rectangleB.size.y/2.;
138
139 float tolerance = 0.00001;
140
141 if (rectangleARight < rectangleBLeft + tolerance
142 || rectangleBRight < rectangleALeft + tolerance
143 || rectangleATop < rectangleBBottom + tolerance
144 || rectangleBTop < rectangleABottom + tolerance)
145 return (VuoRectangle){ { 0, 0 }, { 0, 0 } };
146 else
147 {
148 float intersectionLeft = MAX(rectangleALeft, rectangleBLeft);
149 float intersectionRight = MIN(rectangleARight, rectangleBRight);
150 float intersectionBottom = MAX(rectangleABottom, rectangleBBottom);
151 float intersectionTop = MIN(rectangleATop, rectangleBTop);
152
153 return (VuoRectangle){
154 { (intersectionLeft + intersectionRight) / 2.,
155 (intersectionBottom + intersectionTop) / 2. },
156 { intersectionRight - intersectionLeft,
157 intersectionTop - intersectionBottom }
158 };
159 }
160}
161
168{
169 VuoReal left = MIN(rectangleA.center.x - rectangleA.size.x / 2., rectangleB.center.x - rectangleB.size.x / 2.);
170 VuoReal right = MAX(rectangleA.center.x + rectangleA.size.x / 2., rectangleB.center.x + rectangleB.size.x / 2.);
171 VuoReal bottom = MIN(rectangleA.center.y - rectangleA.size.y / 2., rectangleB.center.y - rectangleB.size.y / 2.);
172 VuoReal top = MAX(rectangleA.center.y + rectangleA.size.y / 2., rectangleB.center.y + rectangleB.size.y / 2.);
173
174 return (VuoRectangle){
175 { (left + right) / 2.,
176 (bottom + top) / 2. },
177 { right - left,
178 top - bottom }
179 };
180}