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);
}
Example #2
0
// 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 );
		}
	}
}
Example #3
0
//==============================================================
// 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;
	}	
    }
}
Example #4
0
	Point3d Triangle3d::CalculateCollisionPosition(Line3d line) {
		RayHit hit = CalculateCollision(line);
		return hit.point;
	}