Exemplo n.º 1
0
//  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;
}
Exemplo n.º 2
0
/// 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;
}
Exemplo n.º 3
0
/// 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;
}