• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • ⚡️ Последний шанс: Вебинар по пентесту стартует через 30 минут!

    Друзья, ровно через 30 минут (8 июля в 19:00) начинается наш практический вебинар по пентесту и поиску уязвимостей!

    Если вы хотите:
    🕵️‍♀️ Узнать, как находить и эксплуатировать уязвимости в веб-приложениях.
    💡 Получить ценные инсайты от настоящего эксперта.
    🚀 Сделать решительный шаг в мир кибербезопасности.
    То этот вебинар для вас!

    Ведущий вебинара – Александр Медведев – эксперт с более чем 10-летним опытом в сфере информационной безопасности, пятикратный победитель Standoff и обладатель престижных сертификаций: OSWE, OSCP, PNPT, CEH, CWAPT.

    Успейте присоединиться! Зарегистрироваться сейчас

    Возникли сложности с регистрацией? Пишите нам: @Codeby_Academy
    Будем вас ждать!

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

  • Автор темы Автор темы zekelive
  • Дата начала Дата начала
Z

zekelive

Здравствуйте, нужна помощь по написанию программы в среде Делфи. Тема: Расчет траектории полета снаряда выпущенного пушкой, с указанием исходных данных: Начальный угол полета, начальная скорость полета и т.д.
Вывод должен производиться на компонент Image. Есть набросок программы. И есть одно НО. Выстрел производится в один шаг, нажал кнопку и вот тебе уже результат. Подскажите пожалуйста, как сделать выстрел поэтапным. Т.е. чтобы можно было наблюдать за полетом снаряда. Наверное нужно использовать таймер, но что и как не могу понять...перепробовал несколько вариантов засовывания в таймер, но к сожалению, получалась чушь!
Код:
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.
 
В таймер нужно засунуть прорисовку и расчет в конкретный момент времени.
 
Код:
 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;.

После Begin можно поставить, например
Код:
form. (refresh/update/repaint);
sleep(100);

Либо таймер, выставляете свойство interval поменьше и на событие ontimer
Код:
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;
 
Я вроде немного шарю, но вот что-то не один из предложенных способов не получается. В первом, на рефреш ругается. А во втором я в таймер выставил все, и в коде, поставил вместо этого запуск таймера...и почему то не рисует

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

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

По второму способу напиши что на таймере и что в кнопке.

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

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

Еще можно не сразу отрисовывать, а находить массив значений а затем ставить задержку на каждый 10 например.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab