void EdgePrewitt::prepareMatrices()
{
    math::matrix<double> tempX(3, 3);
    math::matrix<double> tempY(3, 3);

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            if (j == 0)
                tempX(i, j) = -1;
            else if (j == 1)
                tempX(i, j) = 0;
            else if (j == 2)
                tempX(i, j) = 1;

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            if (i == 0)
                tempY(i, j) = -1;
            else if (i == 1)
                tempY(i, j) = 0;
            else if (i == 2)
                tempY(i, j) = 1;

    g_x = tempX;
    g_y = tempY;
}
void EdgeRoberts::prepareMatrices()
{
    math::matrix<double> tempX(2, 2);
    math::matrix<double> tempY(2, 2);

    tempX(0, 0) = 1;
    tempX(0, 1) = 0;
    tempX(1, 0) = 0;
    tempX(1, 1) = -1;

    tempY(0, 0) = 0;
    tempY(0, 1) = 1;
    tempY(1, 0) = -1;
    tempY(1, 1) = 0;

    g_x = tempX;
    g_y = tempY;
}
Example #3
0
int Collision::AdjustCollisionIndependent(float &sx,float &sy,float dt,GameObject* dis,std::vector<GameObject*> vec,float msize,bool onlySolid){
    Rect tempX(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h);
    Rect tempY(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h);

    int ret = -1;
    float colSize = msize;
    float colSize2 = msize;
    if (sx != 0 || sy !=0)
        for (auto &obj : vec){
            if (obj != dis && !obj->IsDead()){
                if (!onlySolid || obj->IsSolid(dis) ){
                    if (Collision::IsColliding(obj->box,tempY)){
                        float ax=0;
                        if (sy > 0){

                            float dti = Game::GetInstance()->GetDeltaTimeI();
                            float checkSize = (sy/dti);
                            for (ax=0;ax<sy;ax += checkSize){
                                Rect tempY2(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h);
                                if (Collision::IsColliding(obj->box,tempY2)){
                                    if (ax == 0){
                                        for (ax = -sy*2;ax < 0;ax += checkSize){
                                            Rect tempY3(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h);
                                            //bear::out << ax << " -> "<<Collision::IsColliding(obj->box,tempY3)<<":"<<(tempY3.y-dis->box.y) <<"\n";
                                            if (Collision::IsColliding(obj->box,tempY3)){
                                                //bear::out << "p:"<<ax<<"\n";
                                                //ax = 0;
                                                //dis->box.y = obj->box.y-dis->box.h-checkSize*dt;
                                                ax -= checkSize;

                                                break;
                                            }
                                        }
                                        break;
                                    }else{
                                        ax -= checkSize;
                                    }
                                    break;
                                }
                            }
                            sy = ax;
                            tempY = Rect(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h);
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);
                            if (Collision::IsColliding(obj->box,tempY)){
                                sy = 0;
                            }


                            ret = 0;
                        }else{
                            for (ax=colSize;ax>sy;ax-=colSize){
                                Rect tempY2(dis->box.x,dis->box.y-ax*dt,dis->box.w,dis->box.h);
                                if (Collision::IsColliding(obj->box,tempY2)){

                                        ax+=colSize2;
                                    break;
                                }
                            }
                            sy = ax;
                            tempY = Rect(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h);
                            if (Collision::IsColliding(obj->box,tempY)){
                                sy = 0;

                            }
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);


                            ret = 1;
                        }

                    }
                    if (Collision::IsColliding(obj->box,tempX)){
                        float ax=0;
                        if (sx > 0){
                            for (ax=-colSize;ax<sx;ax+=colSize){
                                Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h);

                                if (Collision::IsColliding(obj->box,tempY2)){
                                    ax-=colSize2;
                                    break;
                                }
                            }
                            sx = ax;
                            Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h);
                            if (Collision::IsColliding(obj->box,tempY2)){
                                sx = 0;
                            }
                            tempX = Rect(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h);
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);
                            ret = 2;
                        }else{
                            for (ax=colSize;ax>sx;ax-=colSize){
                                Rect tempY2(dis->box.x-ax*dt,dis->box.y,dis->box.w,dis->box.h);
                                if (Collision::IsColliding(obj->box,tempY2)){

                                        ax+=colSize2;
                                    break;
                                }
                            }
                            sx = ax;
                            Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h);
                            if (Collision::IsColliding(obj->box,tempY2)){
                                sx = 0;
                            }
                            tempX = Rect(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h);
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);
                            ret = 3;
                        }
                    }
                    if (sy == 0 && sx == 0){
                        break;
                    }
                    //Rect tempXY(dis->box.x+sx*dt,dis->box.y+sy*dt,dis->box.w,dis->box.h);
                    //if (Collision::IsColliding(obj->box,tempXY)){

                    //}
                }
            }
        }
    return ret;
}
Example #4
0
int Collision::AdjustCollisionIndependent(float &sx,float &sy,float dt,GameObject* dis,PoolManager &pool,PoolGroupId gid,float msize,bool onlySolid){
    Rect tempX(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h);
    Rect tempY(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h);
    Rect tempXY(dis->box.x+sx*dt,dis->box.y+sy*dt,dis->box.w,dis->box.h);
    int ret = -1;
    float colSize = msize;
    float colSize2 = msize;
    if (sx != 0 || sy !=0)
        for (auto &obj : pool.ForGroup(gid)){
            if (obj != dis && !obj->IsDead()){
                if (!onlySolid || obj->IsSolid(dis) ){
                    if (Collision::IsColliding(obj->box,tempY)){
                        float ax=0;
                        if (sy > 0){
                            /*if (canWarpInverted && Collision::IsColliding(obj->box,dis->box)){
                                for (ax=-sy;ax<0;ax -= colSize){
                                    Rect tempY2(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h);
                                    if (!Collision::IsColliding(obj->box,tempY2)){
                                        ax-=colSize2;
                                        break;
                                    }
                                }
                            }else{*/
                            for (ax=-colSize*2.0f;ax<sy;ax += colSize){
                                Rect tempY2(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h);
                                if (Collision::IsColliding(obj->box,tempY2)){
                                        if (ax >= 0){
                                            ax -=colSize2;
                                        }
                                    break;
                                }
                            }

                            sy = ax;
                            Rect tempY2(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h);
                            if (Collision::IsColliding(obj->box,tempY2)){
                                sy = 0;
                            }
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);

                            ret = 0;

                        }else{
                            //for (ax=-colSize*2.0f;ax<sy;ax += colSize){

                            for (ax=colSize*2.0f;ax>sy;ax-=colSize){
                                Rect tempY2(dis->box.x,dis->box.y-ax*dt,dis->box.w,dis->box.h);
                                if (Collision::IsColliding(obj->box,tempY2)){
                                    if (ax <= 0){
                                        ax +=colSize2;
                                    }
                                        //ax+=colSize2;
                                    break;
                                }
                            }
                            sy = ax;
                            Rect tempY2(dis->box.x,dis->box.y-sy*dt,dis->box.w,dis->box.h);
                            if (Collision::IsColliding(obj->box,tempY2)){
                                sy = 0;
                            }
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);

                            ret = 1;
                        }

                    }
                    if (Collision::IsColliding(obj->box,tempX)){
                        float ax=0;
                        if (sx > 0){
                            int iter = 0;
                            for (ax=-colSize;ax<sx;ax+=colSize){
                                Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h);
                                iter++;
                                if (Collision::IsColliding(obj->box,tempY2)){
                                    ax-=colSize2;
                                    break;
                                }
                            }
                            sx = ax;
                            Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h);
                            if (Collision::IsColliding(obj->box,tempY2)){
                                sx = 0;
                            }
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);
                            ret = 2;
                        }else{
                            for (ax=colSize;ax>sx;ax-=colSize){
                                Rect tempY2(dis->box.x-ax*dt,dis->box.y,dis->box.w,dis->box.h);
                                if (Collision::IsColliding(obj->box,tempY2)){

                                        ax+=colSize2;
                                    break;
                                }
                            }
                            sx = ax;
                            Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h);
                            if (Collision::IsColliding(obj->box,tempY2)){
                                sx = 0;
                            }
                            dis->NotifyCollision(obj);
                            obj->NotifyCollision(dis);
                            ret = 3;
                        }
                    }
                    if (sy == 0 && sx == 0)
                        break;
                }
            }
        }
    return ret;
}