Как сказал Асар, вам, вероятно, нужно изменить размер шага. Попробуйте что-то вроде следующего и посмотрите, сможете ли вы решить проблему, изменив значение t.
function Vertex(x,y,vx,vy,t) {
this.t = t
this.x = x;
this.y = y;
this.px = x-vx*t;
this.py = y-vy*t;
.......
this.tick = function() {
....
var tx = this.x;
var ty = this.y;
this.x = this.x + (this.x - this.px) + this.ax * this.t;
this.y = this.y + (this.y - this.py) + this.ay * this.t;
....
}
....
}
Вы также можете получить некоторую точность, изменив следующий метод, который изменяет скорость мяча, когда он падает на пол.
if (this.y < this.r) {
this.y = 2 * this.r - this.y;
this.py = 2 * this.r - this.py;
}
Если шар отскакивает в середине временного шага, то он движется в направлении гравитационной силы в течение первой части временного шага, но он уходит от гравитационной силы в течение последней части временного шага , Эти два вклада должны частично отменять друг друга. Но в вашем коде вы предполагаете, что гравитационная сила тянет мяч вперед в течение всего временного шага. Вы можете объяснить эту ошибку, изменив формулы в вышеприведенном методе, добавив в него термин, содержащий «this.ax * this.t». (Но я не совсем уверен, как должен выглядеть этот термин).
Лучший способ отладки такой программы - нарисовать график, на котором у вас есть время по оси x и полная механическая энергия по оси y. Тогда вы можете легко определить, теряете ли вы энергию во время скачков или в течение обычных временных шагов.
http://sandbox.electricgrey.com:8080/physics/physics.js