6 rect_t rect_int_area(rect_t rect1, rect_t rect2)
8 float x1 = fmaxf(rect1.x, rect2.x);
9 float y1 = fmaxf(rect1.y, rect2.y);
10 float x2 = fminf(rect1.x + rect1.w, rect2.x + rect2.w);
11 float y2 = fminf(rect1.y + rect1.h, rect2.y + rect2.h);
16 .w = fmaxf(0.0f, x2 - x1),
17 .h = fmaxf(0.0f, y2 - y1)
22 int is_rect_int(rect_t rect1, rect_t rect2)
24 rect_t int_area = rect_int_area(rect1, rect2);
25 return int_area.w * int_area.h > 0.0f;
28 float line_length(line_t line)
30 float dx = line.p1.x - line.p2.x;
31 float dy = line.p1.y - line.p2.y;
32 return sqrtf(dx * dx + dy * dy);
35 void rect_object_impact(const rect_t *object,
36 const rect_t *obstacle,
43 rect_t int_area = rect_int_area(*object, *obstacle);
45 if (int_area.w * int_area.h > 0.0f) {
46 for (int side = 0; side < RECT_SIDE_N; ++side) {
47 line_t object_side = rect_side(*object, side);
48 line_t int_side = rect_side(int_area, side);
50 if (line_length(int_side) > 10.0f) {
51 sides[side] = sides[side] ||
52 (fabs(object_side.p1.x - object_side.p2.x) < 1e-6
53 && fabs(object_side.p1.x - int_side.p1.x) < 1e-6
54 && fabs(object_side.p1.x - int_side.p2.x) < 1e-6)
55 || (fabs(object_side.p1.y - object_side.p2.y) < 1e-6
56 && fabs(object_side.p1.y - int_side.p1.y) < 1e-6
57 && fabs(object_side.p1.y - int_side.p2.y) < 1e-6);
63 line_t rect_side(rect_t rect, rect_side_t side)
65 const float x1 = rect.x;
66 const float y1 = rect.y;
67 const float x2 = rect.x + rect.w;
68 const float y2 = rect.y + rect.h;
91 case RECT_SIDE_BOTTOM:
103 rect_t rect_from_point(point_t p, float w, float h)