2010-10-30 3 views
3

Я пытаюсь изучить интеграцию с Verlet, главным образом потому, что мне скучно, и я хочу оживить свой обычный тренинг «прыгающий мяч».Интеллектуальная интеграция верте

У меня есть простой прыгающий шар. Холст/HTML5 страница в http://sandbox.electricgrey.com:8080/physics/. Если вы нажмете на нее, вы заметите, что мяч не всегда возвращается к той же высоте. Иногда он выше, иногда он ниже. Почему это так?

Это потому, что я слишком упрощаю это? Нужно ли мне вычислять частичные временные шаги, поэтому я получаю точно, когда/где шар сталкивается, а затем продолжается оттуда?

PS: Если у вас есть какие-либо комментарии по поводу моего HTML или Javascript, я бы с удовольствием их услышал. Я просто изучаю, как кодировать Javascript, и я хочу убедиться, что я делаю это правильно.

+1

Вы не должны действительно использовать 'const' для объявления констант. См. Https://developer.mozilla.org/en/JavaScript/Reference/Statements/const, в частности, «const» является ** расширением Mozilla **, оно не поддерживается IE, но частично поддерживаемый Opera с версии 9.0 и Safari ». –

+0

Спасибо за подсказку. Я изменил код, чтобы не использовать const. –

+0

Кажется, что ссылка сейчас мертва. Хотелось бы видеть, о чем вы говорите. –

ответ

1

В алгоритме Верле наиболее важным является шаг по времени для вычисления следующего шага. С помощью Verlet Algorithm вы используете: Basic или Velocity? Какова ваша идея столкновения с полом? Я вижу, что точка столкновения не всегда на одной высоте. В этом случае вам нужно рассчитать время до столкновения (t1), совершить движение с помощью t1, совершить столкновение, а затем сделать движение со временем (t_step - t1). Я использую этот метод при первой реализации this model

0

Как сказал Асар, вам, вероятно, необходимо изменить размер шага. Попробуйте что-то вроде следующего и посмотрите, можете ли вы решить проблему, изменив 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

+0

Спасибо за совет. На данный момент я как бы боремся, чтобы решить эту проблему, но когда я вернусь к ответу на столкновение, я буду помнить об этом. –

Смежные вопросы