Last active
January 4, 2016 19:09
-
-
Save k06a/8665036 to your computer and use it in GitHub Desktop.
Central and non-central kick
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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