На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: shadeofgray, JoeUser
  
> Прыгающий мяч
Всем привет!

Хочу найти зависимость положения прыгающего мяча от времени.
Написал такую процедуру (промежуточный код):
ExpandedWrap disabled
    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;
Результатом являются значения X, H.
Мяч абсолютно упругий, сопротивление воздуха и пр. параметры не учитываются, влияние оказывает только ускорение свободного падения.
Расшифровываю переменные:
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 находился тоже корректно с учётом этих параметров :)

Прошу помощи в этих вопросах...
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
Jin X, используй приближение, что энергия шарика - постоянна. В процессе движения шарика отдельные виды энергии изменяются. Полная энергия шарика будет равна сумме:

1) Потенциальная энергия
2) Кинетическая энергия
3) Энергия упругости

Естественно, чтобы шарик прыгал - потенциальная энергия в момент старта должна быть максимум, кинетическая и упругости = 0. Т.е. шарик в верхнем состоянии. Составляй систему уравнений - одно для падения, второе для полета вверх и торможения. Как составлять - смотри как со временем идет обмен энергиями в "системе шарик". Там и время падения найдешь, и время упругого торможения, скорости ... Ну и, соответственно, положения в пространстве. Вот как-то так.
Мои программные ништякиhttp://majestio.info
JoeUser, ой-йо... Загрузил по самое (я в этих вопросах не спец совсем) :). Посмотрю.
Т.е. это вариант, получается, уже с учётом упругости. А сопротивление воздуха?
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
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 блюд приготовленных из 33 ингредиентов.
Цитата Jin X @
JoeUser, ой-йо... Загрузил по самое (я в этих вопросах не спец совсем)

Боюсь ошибиться, но расчеты потенциальной, кинетической и энергии упругости - это школьный курс физики ;)
Тем не менее, да, Pavia прав - для расчетов, без учета деформации шарика, хватит формул равноускоренного движения, где a = g, а S = H.
Мои программные ништякиhttp://majestio.info
Pavia, отличная мысль! Действительно ж всё просто: берём остаток и всё :D
В общем, исправил пару недочётов (в твоих формулах) и добавил учёт начальной высоты и скорости:
ExpandedWrap disabled
    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=x0+v*t+g*t^2/2
А почему X ускоряется со временем?

Добавлено
Разве мяч должен менять скорость при движении по горизонтали?
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
X - это координата по вертикали. ;)
Ааа, ну тогда ладно.
Но по горизонтали линейно идёт, так ведь?
v*t
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
Да, конечно. (при учёте, что движение рассматривается без сопротивления воздуха).
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0994 ]   [ 19 queries used ]   [ Generated: 24.09.18, 19:43 GMT ]