int LinearLookaheadZoneSearch::Search( float fHeading, float2 fScreenDimensions, int nMaskWidth, int nMaskHeight, Silhouette * pSenderSilhouette, BehaviorParameter * pBehaviorParameter, LineSegment * pTargetLines[3], LineSegment ** pSliceLines, int nNumSlices, map<int, float2> * pmapSenderSilhouettePoints, map<int, float2> * pmapSenderRearPoints, map<int, float2> * pmapReceiverSilhouettePoints) { Search( pTargetLines, pSliceLines, // Project these onto the Receiver. nNumSlices, pSenderSilhouette, pBehaviorParameter->GetReceiverSilhouette(), fHeading, fScreenDimensions, pmapSenderSilhouettePoints, pmapSenderRearPoints, pmapReceiverSilhouettePoints, nMaskWidth, nMaskHeight, pBehaviorParameter); return CalculateCollision( pmapSenderSilhouettePoints, pmapSenderRearPoints, pmapReceiverSilhouettePoints); }
// check for collision between 'this' sprite and sprite void Sprite::CheckCollision( Sprite &sprite ) { int c; c = CalculateCollision( GetBitmask(), sprite.GetBitmask(), (int)(sprite.GetX() - x), (int)(sprite.GetY() - y) ); if( c ) { if(( &sprite != owner ) && (sprite.owner != this)) { // we can't collide with our owner // a collision has occured // modify the velocities float avx, avy, bvx, bvy; // the kinetic energies of the collision float ke_him = .5 * sprite.GetMass() * (sprite.velocity.GetMagnitude() * sprite.velocity.GetMagnitude()); float ke_us = .5 * mass * (velocity.GetMagnitude() * velocity.GetMagnitude()); avx = sprite.velocity.GetX(); avy = sprite.velocity.GetY(); bvx = velocity.GetX(); bvy = velocity.GetY(); // calculate new velocities avx = (velocity.GetX() * (( 2. * mass ) / ( sprite.GetMass() + mass ) )) - (sprite.velocity.GetX() * (( mass - sprite.GetMass() )/( sprite.GetMass() + mass ))); avy = (velocity.GetY() * (( 2. * mass ) / ( sprite.GetMass() + mass ) )) - (sprite.velocity.GetY() * (( mass - sprite.GetMass() )/( sprite.GetMass() + mass ))); bvx = (sprite.velocity.GetX() * (( 2. * sprite.GetMass() ) / ( sprite.GetMass() + mass ) )) - (velocity.GetX() * (( sprite.GetMass() - mass )/( sprite.GetMass() + mass ))); bvy = (sprite.velocity.GetY() * (( 2. * sprite.GetMass() ) / ( sprite.GetMass() + mass ) )) - (velocity.GetY() * (( sprite.GetMass() - mass )/( sprite.GetMass() + mass ))); velocity.Set( bvx, bvy ); sprite.velocity.Set( avx, avy ); // until debugged ke_him = 1.; ke_us = 1.; // call the sprite-child's specific collision code Collision( ke_him ); // and the other's collision code sprite.Collision( ke_us ); } } }
//============================================================== // PredictCollision //============================================================== void box::PredictCollision(int i, int j, vector<DIM, int> pboffset, double& ctime, int& cpartner, vector<DIM, int>& cpartnerpboffset) { double ctimej; if (i!=j) { ctimej = CalculateCollision(i,j,pboffset.Double())+gtime; if (ctimej < gtime) std::cout << "error in find collision ctimej < 0" << std::endl; if ((ctimej < ctime)&&(ctimej < s[j].nextevent.time)) { ctime = ctimej; cpartner = j; cpartnerpboffset = pboffset; } } }
Point3d Triangle3d::CalculateCollisionPosition(Line3d line) { RayHit hit = CalculateCollision(line); return hit.point; }