// Ellipse Collisions bool PhysicsProcessor::collidedRectangleEllipse(Vector2d<float> pos1, Vector2d<float> dims,Vector2d<float> pos2, float r1, float r2) { // If the bounding boxes don't collide then the circle can't collide. /* lastCollisionA.ticks = timer->getTicks(); lastCollisionA.hasCollided = false; lastCollisionB.ticks = lastCollisionA.ticks; lastCollisionB.hasCollided = false;*/ // 1st we create bounding boxes for the circle and do a Rectangle test against the Rectangle. if(collidedRectangleRectangle(pos1, dims,pos2, Vector2d<float>(2*r1,2*r2))) { // Check the tallest extremites if(collidedLineRectangle(pos2 - Vector2d<float>(0.0f,r2),pos2 + Vector2d<float>(0.0f,r2),pos1,dims ) || collidedLineRectangle(pos2 - Vector2d<float>(r1,0.0f),pos2 + Vector2d<float>(r1,0.0f),pos1,dims) ) return true; /// NOTE we are cheating the result for now. float meanR = r1 + r2 * 0.5f; // If the boxes overlap do a radial distance check Vector2d<float> diff = pos2 - pos1; float meanDim = dims.x + dims.y * 0.5f; if(diff.lengthSquared() <= (meanDim*meanDim) + (r2*r2)) { //lastCollision.hasCollided = true; return true; } //return true; } return false; }
/// Circle Collisions bool PhysicsProcessor::collidedCircleCircle(Vector2d<float> pos1, float r1,Vector2d<float> pos2, float r2) { // If the bounding boxes don't collide then the circle can't collide. /*lastCollisionA.ticks = timer->getTicks(); lastCollisionA.hasCollided = false; lastCollisionB.ticks = lastCollisionA.ticks; lastCollisionB.hasCollided = false;*/ // 1st we create bounding boxes for each circle and do a Rectangle test if(collidedRectangleRectangle(pos1, Vector2d<float> (2*r1,2*r1),pos2, Vector2d<float>(2*r2,2*r2))) { // If the boxes overlap do a radial distance check Vector2d<float> diff = pos2 - pos1; if(diff.lengthSquared() <= (r1*r1) + (r2*r2)) { //lastCollisionA.hasCollided = true; //lastCollisionB.hasCollided = true; return true; } } return false; }
/// Point Collisions // Check if a point is on a Line bool PhysicsProcessor::collidedPointLine(Vector2d<float> point,Vector2d<float> lineStart, Vector2d<float> lineEnd) { // Check if the point is actually lineStart or lineEnd if(point == lineStart or point == lineEnd) { /* lastCollisionA.contactPoint = point; lastCollisionA.hasCollided = true; lastCollisionA.ticks = timer->getTicks();*/ return true; } // Check if line is horizontal or vertical // Then we can make quick checks if(lineStart.x == lineEnd.x == point.x) { // Line vertical if(point.y >= lineStart.y and point.y <= lineEnd.y) { /*lastCollisionA.contactPoint = point; lastCollisionA.hasCollided = true; lastCollisionA.ticks = timer->getTicks();*/ return true; } } else if(lineStart.y == lineEnd.y == point.y) { // line horizontal if(point.x >= lineStart.x and point.x <= lineEnd.x) { /*lastCollisionA.contactPoint = point; lastCollisionA.hasCollided = true; lastCollisionA.ticks = timer->getTicks();*/ return true; } } Vector2d<float> AB = lineEnd-lineStart; Vector2d<float> AC = point-lineStart; float magAB = AB.lengthSquared(); float magAC = AC.lengthSquared(); // If one vector is greater in magnitude than the other, then point is not on the line. if(magAC > magAB) { /*lastCollisionA.contactPoint = point; lastCollisionA.hasCollided = false; lastCollisionA.ticks = timer->getTicks();*/ return false; } // Now take unit vectors and see if the directions match AB.normalise(); AC.normalise(); AB = AC - AB; // Same direction so collision has occurred if(AB.lengthSquared() == 0) { /*lastCollisionA.contactPoint = point; lastCollisionA.hasCollided = true; lastCollisionA.ticks = timer->getTicks();*/ return true; } /*lastCollisionA.contactPoint = point; lastCollisionA.hasCollided = false; lastCollisionA.ticks = timer->getTicks();*/ return false; }