Vuo  2.0.2
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
32 
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 }