Advertisement
Guest User

Untitled

a guest
Mar 14th, 2012
511
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  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.     // FOR EACH FACE RELATIVE TO THIS ENTITY:
  12.     for(int i = 0; i < e1_faces; i++)
  13.     {
  14.         // GET CURRENT FACE:
  15.         float fx = e1[i].x - e1[(i + 1) % e1_faces].x;
  16.         float fy = e1[i].y - e1[(i + 1) % e1_faces].y;
  17.        
  18.         // GET CURRENT AXIS PERPENDICULAR TO THE CURRENT FACE:
  19.         float ax = -fy;
  20.         float ay = fx;
  21.        
  22.         // NORMALIZE THE AXIS:
  23.         float len_v = sqrt(ax * ax + ay * ay);
  24.         ax /= len_v;
  25.         ay /= len_v;
  26.  
  27.         // GET MAXIMUM AND MINIMUM POSSIBLE VALUES OF A FLOAT:
  28.         float e1_min = numeric_limits<float>::max(), e1_max = -e1_min;
  29.         float e2_min = numeric_limits<float>::max(), e2_max = -e2_min;
  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 = (ax * (e1[j].x) + ay * (e1[j].y)) / (ax * ax + ay * ay);
  35.             e1_min = (((e1_proj) < (e1_min)) ? (e1_proj) : (e1_min));
  36.             e1_max = (((e1_proj) > (e1_max)) ? (e1_proj) : (e1_max));
  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 = (ax * (e2[j].x) + ay * (e2[j].y)) / (ax * ax + ay * ay);
  43.             e2_min = (((e2_proj) < (e2_min)) ? (e2_proj) : (e2_min));
  44.             e2_max = (((e2_proj) > (e2_max)) ? (e2_proj) : (e2_max));
  45.         }
  46.  
  47.         // EXIT IF THE PROJECTIONS DO NOT OVERLAP:
  48.         if(!(e1_max >= e2_min && e1_min <= e2_max))
  49.         {
  50.             return false;
  51.         }
  52.     }
  53.     // IF ON ALL AXIS AN OVERLAP OCCURS THEN THE ENTITIES ARE INTERSECTING:
  54.     return true;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement