Полет Снаряда

Тема в разделе "Pascal and Delphi", создана пользователем zekelive, 27 фев 2012.

  1. zekelive

    zekelive Гость

    Здравствуйте, нужна помощь по написанию программы в среде Делфи. Тема: Расчет траектории полета снаряда выпущенного пушкой, с указанием исходных данных: Начальный угол полета, начальная скорость полета и т.д.
    Вывод должен производиться на компонент Image. Есть набросок программы. И есть одно НО. Выстрел производится в один шаг, нажал кнопку и вот тебе уже результат. Подскажите пожалуйста, как сделать выстрел поэтапным. Т.е. чтобы можно было наблюдать за полетом снаряда. Наверное нужно использовать таймер, но что и как не могу понять...перепробовал несколько вариантов засовывания в таймер, но к сожалению, получалась чушь!
    Код (Delphi):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, StdCtrls,Math;

    type
    TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    procedure Button2Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    V0,A,S,H,L:real; начальная скорость, угол бросания, расстояние до стенки, высота стенки, высота мячика в момент попадания в стенку
    Const
    G=9.81;
    Pi=3.14;
    implementation
    {$R *.dfm}

    procedure TForm1.Button2Click(Sender: TObject);
    var
    x,y,n:integer; координаты х и у, счетчик
    t:real; время
    begin
    V0:=StrToFloat(Edit1.Text);
    A:=StrToFloat(Edit2.Text); преобразуем соответственно
    S:=StrToFloat(Edit3.Text);
    H:=StrToFloat(Edit4.Text);
    L:=S*Tan(A*Pi/180)-G*Sqr(S)/(2*Sqr(v0*Cos(A*Pi/180)));
    Label9.Caption:=FloatToStr(L);
    if L<0 then
    Label9.Caption:='Недолет'
    else if L>H then
    Label9.Caption:='Перелет'
    else
    Label9.Caption:='Попадание';
    with Image1.Canvas do
    begin
    while T<5 Do рисование траектории
    begin
    T:=T+0.005;
    Y:=180-Round(10*(V0*Sin(A*Pi/180)*T-G*T*T/2));
    X:=5+Round(10*(V0*Cos(A*Pi/180)*T));
    Pixels[X,Y]:=clBlack;
    end;
    MoveTo(0,180); ось х
    LineTo(400,180);

    MoveTo(5,0); ось у
    LineTo(5,400);

    MoveTo(Round(5+10*S),Round(180)); стенка
    LineTo(Round(5+10*S),180-Round(10*H));
    N:=0;
    while N<400 do шкала оси х
    begin
    N:=N+50;
    MoveTo(5+N,180);
    LineTo(5+N,200);
    TextOut(7+N,180,IntToStr(Round(N/10)));
    end;
    N:=0;
    while N<200 do шкала оси у
    begin
    N:=N+50;
    MoveTo(0,180-N);
    LineTo(10,180-N);
    TextOut(0,180-N,IntToStr(Round(N/10)));
    end;
    end;
    end;

    end.
     
  2. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    В таймер нужно засунуть прорисовку и расчет в конкретный момент времени.
     
  3. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    После Begin можно поставить, например
    Код (Text):
    form. (refresh/update/repaint);
    sleep(100);
    Либо таймер, выставляете свойство interval поменьше и на событие ontimer
    Код (Text):
    if t<endT then
    begin
    inc(t,dt);
    Y:=180-Round(10*(V0*Sin(A*Pi/180)*T-G*T*T/2));
    X:=5+Round(10*(V0*Cos(A*Pi/180)*T));
    Pixels[X,Y]:=clBlack;
    end;
     
  4. zekelive

    zekelive Гость

    Я вроде немного шарю, но вот что-то не один из предложенных способов не получается. В первом, на рефреш ругается. А во втором я в таймер выставил все, и в коде, поставил вместо этого запуск таймера...и почему то не рисует

    Добавлено: Разобрался с первым способом. Все работает, но программа конкретно зависает...но рисует! и Даже оси не прорисовались
     
  5. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    По второму способу напиши что на таймере и что в кнопке.

    По первому - надеюсь понятно, что это кусок кода из вашей программы слегка переделаный, т.е. например прорисовку осей я не предлагал менять.
    sleep(x) - функция залипания на Х мс можно его уменьшить.

    А чтобы не было эффекта зависания можно добавить application.ProcessMessages, вроде так пишется.

    Еще можно не сразу отрисовывать, а находить массив значений а затем ставить задержку на каждый 10 например.
     
Загрузка...
Похожие Темы - Полет Снаряда
  1. artemmech
    Ответов:
    4
    Просмотров:
    1.176

Поделиться этой страницей