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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2016, 02:59   #1
Станислав12345
Новичок
Джуниор
 
Регистрация: 05.12.2016
Сообщений: 3
Радость Lazarus(Graph) смоделировать полёт стрелы до мишени. Люди добрые, помогите пожалуйста!

С помощью модулей Graph и Crt в среде Lazarus, ну на паскале кароче,
необходимо сделать следующее...
В левом нижнем углу нарисовать стрелу, в правой стороне экрана - мишень.
Смоделировать полет стрелы и попадание в мишень, угол наклона стрелы регулируется стрелочками на клаве...

Подскажите, как смоделировать полет стрелы( как в жизни), а точнее-
подскажите уравнения, по которым должна лететь стрела.

Проблемы именно здесь, стрела летит либо боком, либо не по правильной траектории.
Стрелу изначально рисовал как отрезок, и изменял с помощью уравнений координаты начала и конца стрелы.
ПРОШУ, ПОМОГИТЕ!
Станислав12345 вне форума Ответить с цитированием
Старый 05.12.2016, 03:12   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Станислав12345 Посмотреть сообщение
подскажите уравнения, по которым должна лететь стрела.
Уточните чисто физику.
Стрела должна лететь прямолинейно равномерно, то есть без учета силы тяжести?
Или по параболе, то есть с учетом ?
type_Oleg вне форума Ответить с цитированием
Старый 05.12.2016, 03:35   #3
Станислав12345
Новичок
Джуниор
 
Регистрация: 05.12.2016
Сообщений: 3
По умолчанию

В задании нет уточнений, считаю, что достаточно сделать и без учёта силы тяжести, так, чтобы это выглядело более реально(жизненно), без каких-либо усложнений...
Станислав12345 вне форума Ответить с цитированием
Старый 05.12.2016, 04:06   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Тогда просто.
Дано:
V - скорость стрелы, пиксел/сек,
fi - угол к горизонту, радианы ( надо вычислить, если вектор скорости задается стрелками на клаве).
t - время, сек
LS - длина стрелы, пиксел
X0,Y0 - начальные координаты острия стрелы на Canvas
Вычисляются координаты острия стрелы на Canvas:
Код:
 X:=X0+Round(t*v*Cos(fi));
 Y:=Y0-Round(t*v*Sin(fi));
координаты конца стрелы:
Код:
 XK:=X-Round(LS*Cos(fi));
 YK:=Y+Round(LS*Sin(fi));
Cos(fi),Sin(fi) лучше вычислить до цикла.
type_Oleg вне форума Ответить с цитированием
Старый 05.12.2016, 04:34   #5
Станислав12345
Новичок
Джуниор
 
Регистрация: 05.12.2016
Сообщений: 3
По умолчанию

Использовал ваши уравнения, не выходит, проблемы с циклом, не знаю как лучше задать... Получается, что необходимо использовать рекурсию!?
Помогите с кодом цикла, пожалуйста!
Станислав12345 вне форума Ответить с цитированием
Старый 05.12.2016, 05:24   #6
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Какая еще рекурсия ?
Вот вам заготовка на Лазарусе. Дорабатывайте .
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  t,LSx,LSy,vX,vY:Real;
  X0,Y0:Integer;
implementation

{$R *.lfm}

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled:=False;
end; 

procedure TForm1.Button1Click(Sender: TObject);
var fi,v,LS:Real;
begin
 fi:=30*PI/180;
 v:=100;
 vX:=v*Cos(fi);
 vY:=v*Sin(fi);
 LS:=30;
 LSx:=LS*Cos(fi);
 LSy:=LS*Sin(fi);
 t:=0;
 X0:=5;
 Y0:=Image1.Height-5;
 Timer1.Enabled:=not Timer1.Enabled;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var X,Y,XK,YK:Integer;
begin
 X:=X0+Round(vX*t);
 Y:=Y0-Round(vY*t);
 if (X>Image1.Width) or (Y<0) then Exit;
 XK:=X-Round(LSx);
 YK:=Y+Round(LSy);
 Image1.Canvas.FillRect(Canvas.ClipRect);
 Image1.Canvas.MoveTo(X,Y);
 Image1.Canvas.LineTo(XK,YK);
 t:=t+Timer1.Interval/1000;
end;
end.
Изображения
Тип файла: png lazarrr.PNG (27.4 Кб, 135 просмотров)

Последний раз редактировалось type_Oleg; 05.12.2016 в 05:26.
type_Oleg вне форума Ответить с цитированием
Старый 05.12.2016, 15:22   #7
Алексей1234567
Заблокирован
 
Регистрация: 05.12.2016
Сообщений: 1
По умолчанию

Олег, у меня аналогичная задача, напишите пожалуйста данный участок кода, в консольном приложении Лазарус (а не в Формах), спасибо!
Используя только Graph и Crt...

Последний раз редактировалось Алексей1234567; 05.12.2016 в 15:29.
Алексей1234567 вне форума Ответить с цитированием
Старый 05.12.2016, 17:29   #8
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Алексей1234567 Посмотреть сообщение
в консольном приложении
Аааааа ... ононокак. Не, я такой древностью не занимался. И изучать неохота.
type_Oleg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пожалуйста люди добрые помогите Ольга ))))) Общие вопросы Delphi 0 16.05.2016 13:31
Люди добрые,помогите пожалуйста!!! Иллоночка Помощь студентам 2 24.12.2009 15:03
Люди добрые,помогите пожалуйста решить задачки!!! Мартышонок Паскаль, Turbo Pascal, PascalABC.NET 4 22.05.2008 08:00