Я выиграл Интернет за источники и нашел большую полезную информацию, но они - математические сайты, пытающиеся сказать мне, как решить то, что удит рыбу, объект должен быть в достигнуть y местоположения. Однако я пытаюсь выполнить моделирование и не нашел серьезных уравнений, которые могут быть реализованы для кодирования для моделирования параболической кривой. Могут те, которые имеют некоторое знание физики помочь мне на этом?
Хотя ответ Бенни хорош, особенно своей общностью, вы можете решить вашу проблему точно, а не использовать шаги конечного интегрирования. Уравнение, которое вам нужно:
s = u*t + 0.5*a*t^2;
Смотрите здесь объяснение того, откуда оно взялось.
Здесь s - перемещение, u - начальная скорость, a - ускорение и t - время. Это уравнение является одномерным, но может быть легко использовано для решения вашей задачи. Все, что вам нужно сделать, это разделить движение снаряда на две составляющие: одну параллельную ускорению и одну перпендикулярную. Если мы позволим Sx описать смещение в направлении x, а Sy - смещение в направлении y, то получим:
Sx = Ux*t + 0.5*Ax*t;
Sy = Uy*t + 0.5*Ay*t;
Теперь в вашем конкретном примере Ax равно 0, так как единственное ускорение обусловлено гравитацией, которая действует в направлении y, то есть Ay = -g. Минус возникает из-за того, что гравитация будет действовать в направлении, противоположном первоначальному движению объекта. Ux и Uy получаются из простой тригонометрии:
Ux = U*cos(angle);
Uy = U*sin(angle);
Сложив все это вместе, вы получите два уравнения, описывающие, где будет находиться снаряд в момент времени t после запуска, относительно своего начального положения:
Sx = U*cos(angle)*t;
Sy = U*sin(angle)*t - 0.5*g*t^2;
Не используйте уравнения для позиции. Вместо этого используйте уравнения для скорости. Вычисляйте новую скорость в каждом цикле моделирования из старой скорости объекта и применяйте ее к вашему объекту. Вам нужно будет знать прошедшее время между каждым циклом моделирования. Конечно, это работает для вертикальной или горизонтальной скорости.
v_new = v_old + acceleration * delta_time (from wikipedia)
Затем примените:
position_new = position_old + v_new * delta_time;
Вы можете использовать простое ускорение -9,8 м/с
(не забывайте, что "вниз" на экране - это на самом деле увеличение вертикального положения! Поэтому для простоты вы можете использовать +9.8
). Или вы можете проявить фантазию и добавить переменное ускорение (например, от ветра, если вы также моделируете горизонтальное движение объекта).
В основном, ускорение, которое вы применяете, основано на сумме сил, приложенных к объекту (сила тяжести, трение, реактивная тяга и т.д.).
F_final = F1 + F2 + ... + Fn
В этом вам может помочь следующее.
Если вы моделируете силу, приложенную к объекту, сначала разбейте силу на горизонтальную и вертикальную составляющие, используя:
F_horiz = F * sin( angle )
F_vert = F * cos( angle ) where angle is the angle between the force and the horizontal.
Затем вычислите ускорение от силы, используя:
a = F / mass
(Я отдаю все заслуги за эти знания моему первому опыту программирования: GORILLA.BAS =) )
Некоторые определения:
x = x-coordinate (horizontal)
y = y-coordinate (vertical)
Vx = x-velocity
Vy = y-veloctiy
t = time
A = initial angle
V0 = intial velocity
g = acceleration due to gravity
Некоторые уравнения:
Vx = V0*cos(A)
Vy = V0*sin(A) - g*t
x = V0*cos(A)*t
y = V0*sin(A)*t - (1/2)*g*t^2
Вот хорошая библиотека, которая может вам помочь
http://sites.google.com/site/physics2d/
Я не особо разбирался в этом, если честно, я наткнулся на это в статье Скотта Уитлока о проекте кода.
http://www.codeproject.com/KB/WPF/SoapBoxCorePinBallDemo.aspx