Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2009, 21:01   #1
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию Моделирование физики

Познаю азы моделирования физики... Выполнил просчёт (грубый) гравитации, столкновения. Помогите пожалуйста с моделированием трения. Задача проста... Из точки "(x,y)" запускаю объект со скоростью "vi" под заданным углом "ugol". А далше...

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  g = 1; //"грубая" гравитация
  a = 0.3; //трение... сколько скорости потеряет объект при столкновении
var
  vi,ugol : integer;
  vix,viy : real;
  x, y : integer;
begin
  vi := StrToIntDef(Edit2.Text,10);
  ugol := StrToIntDef(Edit1.Text,30);
  vix := vi * cos(ugol/180 * pi); //скорость по координате x
  viy := vi * sin(ugol/180 * pi); //скорость по координате y
  x := 1; //начальные значения
  y := 1;
  while true do
  begin
    if stop then break;
    application.ProcessMessages;
    Canvas.Brush.Color := clWhite;
    Canvas.FillRect(rect(0,0,Self.ClientWidth,Self.ClientHeight));
    Canvas.Draw(x,y,bmp);
    if (x <= 0) or (x >= self.ClientWidth) then //моделирование столкновения
        vix := -vix;
    if (y <= 0) or (y >= self.ClientHeight) then
        viy := -viy;

    x := round(x + vix); //моделирование траектории
    y := round(y + viy);

    if viy < 0 then //моделирование гравитации
      viy := viy + g
    else
      viy := viy - g;

    sleep(25);
  end;
  stop := false;
end;
всё в порядке... но даже без трения, объект при некоторых значениях g и a, просто выпадает за пределы, предписанные ему... бред какой-то... а при значениях в этом листинге, всё в порядке... что за бред?
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.

Последний раз редактировалось notHaker; 05.12.2009 в 21:21.
notHaker вне форума Ответить с цитированием
Старый 06.12.2009, 01:59   #2
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

откликнитесь... пожалуйста...
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 06.12.2009, 09:52   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
//считаем куда он должен прийти
    x := round(x + vix); //моделирование траектории
    y := round(y + viy);

if x>=self.ClientWidth //выскочили за границу 
  // x+x.with>clientwith если объект имеет размеры
 then begin
  wix:=-wix; //отражаем скорость на будущее(меняем знак)
  x:=self.clientwith-(x-self.clientwith);//отражаем путь пройденный за границей еще здесь надо наверное учесть его размеры
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.12.2009, 15:23   #4
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
//считаем куда он должен прийти
    x := round(x + vix); //моделирование траектории
    y := round(y + viy);

if x>=self.ClientWidth //выскочили за границу 
  // x+x.with>clientwith если объект имеет размеры
 then begin
  wix:=-wix; //отражаем скорость на будущее(меняем знак)
  x:=self.clientwith-(x-self.clientwith);//отражаем путь пройденный за границей еще здесь надо наверное учесть его размеры
end;
ммм... он выпадает на совсем... это коррекция границ и её я понял, спасибо. НО, скорость абсолютно не зависит от координат, а она не принимает тех значений, которые возвратили бы объект обратно... Когда реализовал трение (просто "отнимал" скорость при столкновении), то вабще сумасброд при гравитации > 1.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 07.12.2009, 18:28   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
    if viy < 0 then //моделирование гравитации
      viy := viy + g
    else
      viy := viy - g;
считаем что viy>0 //движение вниз viy<0 //движение вверх
viy:=viy+g; всегда
ускорение/замедление зависит от совпадения/несовпадения знаков
viy и g
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.12.2009, 13:43   #6
Alien41180
 
Регистрация: 11.12.2009
Сообщений: 5
По умолчанию

У меня проблемма слегка иная. Создал код расчитывающий физику человека. Как разместить на сайте архив, чтоб желающие могли протестировать и высказать мнения. Код написан в C#.
Alien41180 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на моделирование qaqa Microsoft Office Excel 8 20.11.2009 20:53
геометрическое моделирование в delphi Ledi_Kapriza Общие вопросы Delphi 7 04.12.2008 14:57
Моделирование системы. AND Помощь студентам 4 08.11.2007 17:59