Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool Entity::collides(Entity other)
- {
- // GETTING ORIENTED BOUNDING BOXES:
- vector<Point> e1 = this->getOBB();
- vector<Point> e2 = other.getOBB();
- // GETTING NUMBER OF FACES FOR EACH ENTITY:
- int e1_faces = e1.size();
- int e2_faces = e2.size();
- // FOR EACH FACE RELATIVE TO THIS ENTITY:
- for(int i = 0; i < e1_faces; i++)
- {
- // GET CURRENT FACE:
- float fx = e1[i].x - e1[(i + 1) % e1_faces].x;
- float fy = e1[i].y - e1[(i + 1) % e1_faces].y;
- // GET CURRENT AXIS PERPENDICULAR TO THE CURRENT FACE:
- float ax = -fy;
- float ay = fx;
- // NORMALIZE THE AXIS:
- float len_v = sqrt(ax * ax + ay * ay);
- ax /= len_v;
- ay /= len_v;
- // GET MAXIMUM AND MINIMUM POSSIBLE VALUES OF A FLOAT:
- float e1_min = numeric_limits<float>::max(), e1_max = -e1_min;
- float e2_min = numeric_limits<float>::max(), e2_max = -e2_min;
- // GET THE MAXIMUM AND MINIMUM VALUES OF THIS ENTITY RELATIVE TO THE AXIS:
- for(int j = 0; j < e1_faces; j++)
- {
- float e1_proj = (ax * (e1[j].x) + ay * (e1[j].y)) / (ax * ax + ay * ay);
- e1_min = (((e1_proj) < (e1_min)) ? (e1_proj) : (e1_min));
- e1_max = (((e1_proj) > (e1_max)) ? (e1_proj) : (e1_max));
- }
- // GET THE MAXIMUM AND MINIMUM VALUES OF THE OTHER ENTITY RELATIVE TO THE AXIS:
- for(int j = 0; j < e2_faces; j++)
- {
- float e2_proj = (ax * (e2[j].x) + ay * (e2[j].y)) / (ax * ax + ay * ay);
- e2_min = (((e2_proj) < (e2_min)) ? (e2_proj) : (e2_min));
- e2_max = (((e2_proj) > (e2_max)) ? (e2_proj) : (e2_max));
- }
- // EXIT IF THE PROJECTIONS DO NOT OVERLAP:
- if(!(e1_max >= e2_min && e1_min <= e2_max))
- {
- return false;
- }
- }
- // IF ON ALL AXIS AN OVERLAP OCCURS THEN THE ENTITIES ARE INTERSECTING:
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement