fork download
  1. bool Entity::collides(Entity other)
  2. {
  3. // GETTING ORIENTED BOUNDING BOXES:
  4. vector<Point> e1 = this->getOBB();
  5. vector<Point> e2 = other.getOBB();
  6.  
  7. // GETTING NUMBER OF FACES FOR EACH ENTITY:
  8. int e1_faces = e1.size();
  9. int e2_faces = e2.size();
  10.  
  11. // MINIMUM OVERLAP:
  12. float overlap1 = FLT_MAX;
  13. float overlap2 = FLT_MAX;
  14.  
  15. // FOR EACH FACE RELATIVE TO THIS ENTITY:
  16. for(int i = 0; i < e1_faces; i++)
  17. {
  18. // GET CURRENT FACE:
  19. Point face(e1[i].x - e1[(i + 1) % e1_faces].x, e1[i].y - e1[(i + 1) % e1_faces].y);
  20.  
  21. // GET CURRENT AXIS PERPENDICULAR TO THE CURRENT FACE:
  22. Point axis(-face.y, face.x);
  23.  
  24. // NORMALIZE THE AXIS:
  25. axis /= sqrt(axis.x * axis.x + axis.y * axis.y);
  26.  
  27. // GET MAXIMUM AND MINIMUM POSSIBLE VALUES OF A FLOAT:
  28. Point e1_overlap(FLT_MAX, -FLT_MAX);
  29. Point e2_overlap(FLT_MAX, -FLT_MAX);
  30.  
  31. // GET THE MAXIMUM AND MINIMUM VALUES OF THIS ENTITY RELATIVE TO THE AXIS:
  32. for(int j = 0; j < e1_faces; j++)
  33. {
  34. float e1_proj = ((axis.x * e1[j].x) + (axis.y * e1[j].y)) / ((axis.x * axis.x) + (axis.y * axis.y));
  35. e1_overlap.x = min(e1_proj, e1_overlap.x);
  36. e1_overlap.y = max(e1_proj, e1_overlap.y);
  37. }
  38.  
  39. // GET THE MAXIMUM AND MINIMUM VALUES OF THE OTHER ENTITY RELATIVE TO THE AXIS:
  40. for(int j = 0; j < e2_faces; j++)
  41. {
  42. float e2_proj = ((axis.x * e2[j].x) + (axis.y * e2[j].y)) / ((axis.x * axis.x) + (axis.y * axis.y));
  43. e2_overlap.x = min(e2_proj, e2_overlap.x);
  44. e2_overlap.y = max(e2_proj, e2_overlap.y);
  45. }
  46. if((e1_overlap.y - e1_overlap.x) < overlap1)
  47. {
  48. overlap1 = (e1_overlap.y - e1_overlap.x);
  49. }
  50. if((e2_overlap.y - e2_overlap.x) < overlap2)
  51. {
  52. overlap2 = (e2_overlap.y - e2_overlap.x);
  53. }
  54.  
  55. // EXIT IF THE PROJECTIONS DO NOT OVERLAP:
  56. if(!(e1_overlap.y >= e2_overlap.x && e1_overlap.x <= e2_overlap.y))
  57. {
  58. return false;
  59. }
  60. }
  61. // IF ON ALL AXIS AN OVERLAP OCCURS THEN THE ENTITIES ARE INTERSECTING:
  62. return true;
  63. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty