I wrote a program that will simulate a ball being thrown off a 50 meter building.
I added in collision detection by reversing the velocity in the y direction when the ball hits the ground (y < 0), keeping the horizontal velocity the same, and multiplying both velocities by some min value, so that the ball will ultimately come to a rest.
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main() {
FILE *fp;
FILE *fr;
float ax = 0, ay = 0, x = 0, y = 0, vx = 0, vy = 0;
float time = 0, deltaTime = .001;
float min = -.00000000001;
int numBounces = 0;
fr = fopen("input_data.txt", "rt");
fp = fopen( "output_data.txt", "w" );
if(fr == NULL){ printf("File not found");}
if(fp == NULL){ printf("File not found");}
fscanf(fr, "ax: %f ay: %f x: %f y: %f vx: %f vy: %f\n", &ax, &ay, &x, &y, &vx, &vy);
while (vx > min && vy > min) {
time = time + deltaTime;
vx = vx + ax*deltaTime;
vy = vy + ay*deltaTime;
x = x + vx*deltaTime + (.5*ax*deltaTime*deltaTime);
y = y + vy*deltaTime + (.5*ay*deltaTime*deltaTime);
fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t\n", ax, ay, x, y, vx, vy, time);
//Collision occurs; implement collision response
if(y < 0) {
vx = vx + ax*deltaTime*(.00001);
vy = -(vy + ay*deltaTime*(.00001));
numBounces++;
fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t\n", ax, ay, x, y, vx, vy, time);
}
}
fclose(fp);
fclose(fr);
system ("PAUSE");
return 0;
}
I am not getting the correct values needed to produce a correct graph of the data.
It could be because my conditions in the while loop need to be changed, or that I did not implement collision response correctly.
Here is also some sample data:
ax: 0 ay: -9.8 x: 0 y: 50 vx: 8.66 vy: 5

for not outputing anything you can try
fflush(fp)at the end of each cycle. and as far as I can see in your code your object gets some more speed whenever it hits the ground you have to changevy = -(vy + ay*deltaTime*(.00001))tovy = -(vy - ay*deltaTime*(.00001))to correct it. you can also create a better implementation for collision if you calculate the exact time of collision whenevery < 0and then move object down, change speeds, and move object up for the rest of cycle to have more realistic collision.we know that deltaY = 1/2*ay*t^2 + vy*t so we can compute t using the folling formula :
and since t has to be positive and knowing that ay is negetive and py is positive, we can assume the currect answer is
now we have tc which is time of collision. so we have to reverse the last changes in position and speed, then just step time
tcseconds and then reverse vy and stepdeltaTime - tcseconds to complete that frame. so inside the if condition would be like (I just may have some problems doing the math, so if by any chance you didn’t get expected results jsut doublecheck all equations):