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; }
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; }
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; }