Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.96.146] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Хочу найти зависимость положения прыгающего мяча от времени. Написал такую процедуру (промежуточный код): procedure Calc; var DeltaT: Double; begin T := (GetTickCount - StartTick) / 1000.0; DeltaT := T - PrevT; repeat SpeedOnFloor := Sqrt(Sqr(PrevV) + 2*G*PrevH); TimeToFloor := (SpeedOnFloor - PrevV) / G; if DeltaT <= TimeToFloor then Break; H := 0; PrevH := 0; V := - SpeedOnFloor * Elast; PrevV := V; PrevT := PrevT + TimeToFloor; DeltaT := T - PrevT; Inc(B); if Abs(V) <= MinV then begin V := 0; H := 0; X := SpeedX * T; Exit; end; MaxY := 0; until False; V := PrevV + G * DeltaT; H := PrevH - (PrevV + G*DeltaT/2) * DeltaT; X := SpeedX * T; end; Мяч абсолютно упругий, сопротивление воздуха и пр. параметры не учитываются, влияние оказывает только ускорение свободного падения. Расшифровываю переменные: H - высота мяча, V - скорость мяча (> 0, когда мяч летит вниз), T - прошедшее время. SpeedOnFloor - скорость в момент следующего удара о землю. TimeToFloor - время между предыдущим и следующим ударом (если это будет первый удар, то от начала броска). PrevH, PrevV, PrevT - высота, скорость и время предыдущего удара о землю (либо параметры в момент броска). Elast - условный коэффициент упругости (условный, потому что подставлен в формулу без учёта физики, а просто скорость в момент удара меняет знак и умножается на это значение < 1). MinV - минимальная скорость, меньше которой считается, что мяч остановился. B - кол-во ударов о землю, N - общее кол-во вызовов Calc. Что хочу: 1. Как видно из кода, H находится итерационно, т.е. чтобы найти высоту в момент времени T проверяется время удара о землю (TimeToFloor), и если T > TimeToFloor, тогда T уменьшается на TimeToFloor и цикл повторяется. Хочется найти единую формулу без итераций. Это возможно? 2. Добавить учёт упругости мяча (без учёта его деформации) и сопротивления воздуха. Ну и чтобы X находился тоже корректно с учётом этих параметров Прошу помощи в этих вопросах... |
Сообщ.
#2
,
|
|
|
Jin X, используй приближение, что энергия шарика - постоянна. В процессе движения шарика отдельные виды энергии изменяются. Полная энергия шарика будет равна сумме:
1) Потенциальная энергия 2) Кинетическая энергия 3) Энергия упругости Естественно, чтобы шарик прыгал - потенциальная энергия в момент старта должна быть максимум, кинетическая и упругости = 0. Т.е. шарик в верхнем состоянии. Составляй систему уравнений - одно для падения, второе для полета вверх и торможения. Как составлять - смотри как со временем идет обмен энергиями в "системе шарик". Там и время падения найдешь, и время упругого торможения, скорости ... Ну и, соответственно, положения в пространстве. Вот как-то так. |
Сообщ.
#3
,
|
|
|
JoeUser, ой-йо... Загрузил по самое (я в этих вопросах не спец совсем) . Посмотрю.
Т.е. это вариант, получается, уже с учётом упругости. А сопротивление воздуха? |
Сообщ.
#4
,
|
|
|
x=x0+v*t+g*t^2/2
v=v0+g*t; 0=v*t+g*t^2/2 Откуда находим t, T=-2*v/g; - это будет период. H=v*(t mod T)+g*(t mod T)^2/2 v=v0+g*t; С учётом потери энергии при ударе. B:=t div T; H:=(v-(1-E)*B)*(t mod T)+g*(t mod T)^2/2; v=(v0-(1-E)*B)+g*t; Цитата Jin X @ А сопротивление воздуха? А по какому закону сопротивление? Если шарик один то ламинарное и пропорционально v. Тут интегрировать надо. |
Сообщ.
#5
,
|
|
|
Цитата Jin X @ JoeUser, ой-йо... Загрузил по самое (я в этих вопросах не спец совсем) Боюсь ошибиться, но расчеты потенциальной, кинетической и энергии упругости - это школьный курс физики Тем не менее, да, Pavia прав - для расчетов, без учета деформации шарика, хватит формул равноускоренного движения, где a = g, а S = H. |
Сообщ.
#6
,
|
|
|
Pavia, отличная мысль! Действительно ж всё просто: берём остаток и всё
В общем, исправил пару недочётов (в твоих формулах) и добавил учёт начальной высоты и скорости: procedure Calc; var VonFloor, ShiftT, Period, TinP: Double; begin T := (GetTickCount - StartTick) / 1000.0; VonFloor := -Sqrt(Sqr(StartV) + 2*G*StartH); // эти 3 строки достаточно выпонить 1 раз Period := -2 * VonFloor / G; ShiftT := Period + (StartV+VonFloor)/G; TinP := FMod(T+ShiftT, Period); H := - (VonFloor + G*TinP/2) * TinP; X := SpeedX * T; // пока под вопросом end; Цитата Pavia @ А почему X ускоряется со временем? x=x0+v*t+g*t^2/2 Добавлено Разве мяч должен менять скорость при движении по горизонтали? |
Сообщ.
#7
,
|
|
|
X - это координата по вертикали.
|
Сообщ.
#8
,
|
|
|
Ааа, ну тогда ладно.
Но по горизонтали линейно идёт, так ведь? v*t |
Сообщ.
#9
,
|
|
|
Да, конечно. (при учёте, что движение рассматривается без сопротивления воздуха).
|