public Vector2 GetCollisionPoint(CollisionUnit other)
{
Vector2 otherCircleCenter;
int otherCircleRadius;
Vector2 boxUpperLeft;
Vector2 boxLowerRight;
float dX;
float dY;
float ratio;
Vector2 collisionPoint = new Vector2(-1, -1);
if (mCollisionType == CollisionType.COLLISION_CIRCLE && other.GetCollisionType() == CollisionType.COLLISION_CIRCLE)
{
otherCircleCenter = other.GetCircleCenter();
otherCircleRadius = other.GetCircleRadius();
dX = otherCircleCenter.X - mCircleCenter.X;
dY = otherCircleCenter.Y - mCircleCenter.Y;
ratio = ((float)mCircleRadius) / (mCircleRadius + otherCircleRadius);
dX *= ratio;
dY *= ratio;
collisionPoint = new Vector2(mCircleCenter.X + dX, mCircleCenter.Y + dY);
}
else if ((mCollisionType == CollisionType.COLLISION_CIRCLE && other.GetCollisionType() == CollisionType.COLLISION_BOX)
|| (mCollisionType == CollisionType.COLLISION_BOX && other.GetCollisionType() == CollisionType.COLLISION_CIRCLE))
{
if (mCollisionType == CollisionType.COLLISION_CIRCLE)
{
otherCircleCenter = mCircleCenter;
otherCircleRadius = mCircleRadius;
boxUpperLeft = other.GetUpperLeft();
boxLowerRight = other.GetLowerRight();
}
else
{
otherCircleCenter = other.GetCircleCenter();
otherCircleRadius = other.GetCircleRadius();
boxUpperLeft = mPoint1;
boxLowerRight = mPoint2;
}
if (otherCircleCenter.X > boxLowerRight.X)
{
if (otherCircleCenter.Y > boxLowerRight.Y)
{
collisionPoint = boxLowerRight;
}
else if (otherCircleCenter.Y < boxUpperLeft.Y)
{
collisionPoint = new Vector2(boxLowerRight.X, boxUpperLeft.Y);
}
else
{
collisionPoint = new Vector2(otherCircleCenter.X - otherCircleRadius, otherCircleCenter.Y);
}
}
else if (otherCircleCenter.X < boxUpperLeft.X)
{
if (otherCircleCenter.Y > boxLowerRight.Y)
{
collisionPoint = new Vector2(boxUpperLeft.X, boxLowerRight.Y);
}
else if (otherCircleCenter.Y < boxUpperLeft.Y)
{
collisionPoint = boxUpperLeft;
}
else
{
collisionPoint = new Vector2(otherCircleCenter.X + otherCircleRadius, otherCircleCenter.Y);
}
}
else if (otherCircleCenter.Y > boxLowerRight.Y)
{
collisionPoint = new Vector2(otherCircleCenter.X, otherCircleCenter.Y - otherCircleRadius);
}
else if (otherCircleCenter.Y < boxUpperLeft.Y)
{
collisionPoint = new Vector2(otherCircleCenter.X, otherCircleCenter.Y + otherCircleRadius);
}
else
{
// inside
collisionPoint = otherCircleCenter;
}
}
return collisionPoint;
}