Skip to content

Instantly share code, notes, and snippets.

@k06a
Last active January 4, 2016 19:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k06a/8665036 to your computer and use it in GitHub Desktop.
Save k06a/8665036 to your computer and use it in GitHub Desktop.
Central and non-central kick
//
// Here is some illustration of central kick:
// https://commons.wikimedia.org/wiki/File:Elastischer_stoß3.gif
//
// V -V
// [m = 2]---> <---[m = 1]
// [m = 2] [m = 1]
// [m = 2][m = 1]
// [m = 2] [m = 1]
// <-[m = 2] [m = 1]----->
// -1/3 V 5/3 V
//
void centralKick(double m1, double m2, double u1, double u2, double *v1, double *v2)
{
*v1 = (2*m2*u2 + (m2 - m1)*u1)/(m1 + m2);
*v2 = (2*m1*u1 + (m1 - m2)*u2)/(m1 + m2);
}
// This kick is not central :)
void notCentralKick(double x1, double y1, double m1, double u1x, double u1y,
double x2, double y2, double m2, double u2x, double u2y,
double *v1x, double *v1y,
double *v2x, double *v2y)
{
double angle = atan2(y2-y1,x2-x1);
double sprite1Speed = sqrt(u1x*u1x + u1y*u1y);
double sprite2Speed = sqrt(u2x*u2x + u2y*u2y);
double sprite1Angle = atan2(u1y,u1x);
double sprite2Angle = atan2(u2y,u2x);
double alpha = sprite1Angle - angle;
double beta = sprite2Angle - angle;
double sprite1SpeedX = sprite1Speed*cos(alpha);
double sprite2SpeedX = sprite2Speed*cos(beta);
double sprite1SpeedY = sprite1Speed*sin(alpha);
double sprite2SpeedY = sprite2Speed*sin(beta);
double vx1, vx2;
centralKick(m1, m2, sprite1SpeedX, sprite2SpeedX, &vx1, &vx2);
double newSpeed1 = sqrt(sprite1SpeedY*sprite1SpeedY + vx1*vx1);
double newSpeed2 = sqrt(sprite2SpeedY*sprite2SpeedY + vx2*vx2);
double newAplha = atan2(sprite1SpeedY,vx1);
double newBeta = atan2(sprite2SpeedY,vx2);
*v1x = newSpeed1*cos(newAplha + angle);
*v1y = newSpeed1*sin(newAplha + angle);
*v2x = newSpeed2*cos(newBeta + angle);
*v2y = newSpeed2*sin(newBeta + angle);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment