, чтобы ничего не выводить, вы можете попробовать fflush(fp)
в конце каждого цикла. и, насколько я вижу в вашем коде, ваш объект набирает некоторую скорость всякий раз, когда он достигает земли, вы должны изменить vy = -(vy + ay*deltaTime*(.00001))
на vy = -(vy - ay*deltaTime*(.00001))
, чтобы исправить это. Вы также можете создать лучшую реализацию для столкновения, если вы вычисляете точное время столкновения всякий раз, когда y < 0
, а затем перемещаете объект вниз, меняете скорость и перемещаете объект вверх до конца цикла, чтобы иметь более реалистичное столкновение.
мы знаем, что deltaY = 1/2 * ay * t ^ 2 + vy * t, поэтому мы можем вычислить t, используя формулу Фоллинга:
assuming py is the current height of object(it's distance to ground)
=> -py = 0.5 * ay* t * t + vy * t
=> 0 = 0.5 * ay * t * t+ vy * t + py
=> t = (-vy +- sqrt(vy*vy - 2 * ay * py)) / (2 * ay)
и поскольку t должен быть положительным, и зная, что ay отрицательно, а py положительно, мы можем предположить, что правильный ответ -
=> tc = (sqrt(vy*vy - 2 * ay * py) - vy) / 2 / ay
теперь у нас есть tc - время столкновения. поэтому мы должны обратить вспять последние изменения в положении и скорости, затем просто шаг tc
секунд, а затем обратный VY и шаг deltaTime - tc
секунд, чтобы завершить этот кадр. поэтому внутри условия if было бы похоже (у меня просто могут быть некоторые проблемы с математикой, поэтому, если по какой-то случайности вы не получили ожидаемых результатов, просто перепроверьте все уравнения):
if (y < 0) {
float tc = (sqrt(vy*vy - 2 *ay * y)) / 2 / ay;
x = x - vx*deltaTime - (.5*ax*deltaTime*deltaTime);
y = y - vy*deltaTime - (.5*ay*deltaTime*deltaTime);
vx = vx - ax * deltaTime;
vy = vy - ay * deltaTime;
vx = vx + ax * tc;
vy = vy + ay * tc;
x = x + vx*tc + (.5*ax*tc*tc);
y = y + vy*tc + (.5*ay*tc*tc);
vy = -(vy - ay*deltaTime*(.00001));
// you can also change above line and simply write
// vy = vy * -0.99;
// that will also create friction as you want it to be there
vx = vx + ax * (deltaTime - tc);
vy = vy + ay * (deltaTime - tc);
x = x + vx* (deltaTime - tc) + (.5*ax* (deltaTime - tc)* (deltaTime - tc));
y = y + vy* (deltaTime - tc) + (.5*ay* (deltaTime - tc)* (deltaTime - tc));
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);
}