На главную
ПРАВИЛА 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,0933 ]   [ 14 queries used ]   [ Generated: 23.10.18, 01:30 GMT ]