mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-04-25 01:22:10 -04:00
76 lines
1.2 KiB
C++
76 lines
1.2 KiB
C++
/*
|
|
* BoundingBox.cpp
|
|
*
|
|
* Created on: 4 mar 2019
|
|
* Author: robert
|
|
*/
|
|
|
|
#include "BoundingBox.hpp"
|
|
|
|
namespace gui {
|
|
|
|
BoundingBox::BoundingBox() : x {0}, y{0}, w{0}, h{0} {
|
|
}
|
|
|
|
BoundingBox::BoundingBox( int16_t x, int16_t y, uint16_t w, uint16_t h) : x{x}, y{y}, w{w}, h{h} {
|
|
}
|
|
|
|
BoundingBox::~BoundingBox() {
|
|
}
|
|
|
|
bool BoundingBox::intersect( const BoundingBox& box1, const BoundingBox& box2, BoundingBox& result ) {
|
|
const BoundingBox* l;
|
|
const BoundingBox* r;
|
|
|
|
if( box1.x < box2.x ) {
|
|
l = &box1; r = &box2;
|
|
}
|
|
else {
|
|
l = &box2; r = &box1;
|
|
}
|
|
|
|
int w = l->x + l->w - r->x;
|
|
if( w <= 0 )
|
|
{
|
|
result.clear();
|
|
return false;
|
|
}
|
|
//most left bbox overlap right box entirely
|
|
if( (l->x + l->w) >= (r->x + r->w) )
|
|
{
|
|
w = r->w;
|
|
}
|
|
result.w = w;
|
|
result.x = r->x;
|
|
|
|
//vertical check
|
|
//select bbox that is higher
|
|
const BoundingBox* u;
|
|
if( box1.y < box2.y ) {
|
|
l = &box1; u = &box2;
|
|
}
|
|
else {
|
|
l = &box2; u = &box1;
|
|
}
|
|
|
|
int h = l->y + l->h - u->y;
|
|
|
|
if( h <= 0 )
|
|
{
|
|
result.clear();
|
|
return false;
|
|
}
|
|
|
|
//most lower bbox overlap upper box entirely
|
|
if( (l->y + l->h) >= (u->y + u->h) )
|
|
{
|
|
h = u->h;
|
|
}
|
|
result.y = u->y;
|
|
result.h = h;
|
|
|
|
return true;
|
|
}
|
|
|
|
} /* namespace gui */
|