Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.10.2017, 18:48
Sulackan Sulackan вне форума
Прохожий
 
Регистрация: 09.10.2017
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Добрый день, нужна помощь

Имеется такой код(Алгоритм рисования траектории), задача с помощью таймера пустить по этой траектории фигуру, застрял на этом моменте и очень прошу вашей помощи

Код:
var x,y,d,k1,k2,k3,k4,i,j:integer;
begin
//координаты верхнего левого треугольника
x:=100;
y:=100;
//длина катета
d:=50;
moveto(x,y);
for j:=1 to 4 do
 begin
  case j of
  1:begin
    k1:=1;
    k2:=1;
    k3:=0;
    k4:=-1;
    end;
  2:begin
    k1:=-1;
    k2:=1;
    k3:=1;
    k4:=0;
    end;
  3:begin
    k1:=-1;
    k2:=-1;
    k3:=0;
    k4:=1;
    end;
  4:begin
    k1:=1;
    k2:=-1;
    k3:=-1;
    k4:=0;
    end;
  end;
for i:=1 to 5 do
 begin
  if odd(i) then
   begin
    lineto(x+k1*d,y+k2*d);
    x:=x+k1*d;
    y:=y+k2*d;
   end
  else
   begin
    lineto(x+k3*d,y+k4*d);
    x:=x+k3*d;
    y:=y+k4*d;
   end;
 end;
end;
Админ: Пользуемся тегами при оформлении кода!
Изображения
Тип файла: png Траектория.png (644 байт, 4 просмотров)
Тип файла: png Фигура.png (1.8 Кбайт, 4 просмотров)

Последний раз редактировалось Sulackan, 09.10.2017 в 23:32.
Ответить с цитированием
  #2  
Старый 09.10.2017, 22:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А чё ты делаешь-то?
опиши лучше словами что надо сделать. а то приведенный код вообще непонятен, а смотреть файлы просто лень.

В принципе, как все это можно делать через таймер.
В таймере ты должен за 1 проход делать 1 шаг.
Пусть у нас есть некоторая процедура, которая отрисовывает нужный объект в переданных координатак (DrawObject) и некоторая функция, которая вычисляет следующее положение объекта (NextStep). тогда код должен выглядеть примерно так:
Код:
type
  TForm1 = class(TForm)
  ...
  prvate
    x, y, dx, dy : integer; // координаты объекта и шаг их изменения
   procedure DrawObject(x,y : integer);
   procedure NextStep(var ax,ay : integer; adx, ady : integer);
  ...
  end;

...

// Инициализация при создании формы
procedure TForm1.FormCreate(Sender : TObject);
begin
  x := 100;
  y := 100;
  dx := 1;
  dy := 3;
  DrawObject(x,y);
end;

// Событие таймера - вычислили новое положение объекта и отрисовали его
procedure TForm1.Timer1Timer(Sender : TObject);
begin
  NextStep(x,y,dx,dy);
  DrawObject(x,y);
end; 

Ну и в принципе надо не забыть стирать за собой старую отрисовку, если это надо.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Sulackan (09.10.2017)
  #3  
Старый 10.10.2017, 05:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот, пришел домой, быстренько накидал рабочий примерчик броска кирпича вверх (по параболе):
Код:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm2 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    x, y, v, a : integer;
    procedure DrawObject(ax,ay : integer);
    procedure NextStep(var ax, ay, av : integer; aa: integer);
    procedure TimerStartStop(tmStart : Boolean);
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  TimerStartStop(True);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  TimerStartStop(False);
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  Close;
end;

procedure TForm2.TimerStartStop(tmStart : Boolean);
begin
  Timer1.Enabled := tmStart;
  Button1.Enabled := not Timer1.Enabled;
  Button2.Enabled := Timer1.Enabled;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  x := 0;
  y := 0;
  a := -3;
  v := 100;
  DrawObject(x,PaintBox1.Height-y); // Reverse y
end;

procedure TForm2.DrawObject(ax,ay : integer);
begin
  With PaintBox1.Canvas Do
    begin
      FillRect(Rect(0,0,PaintBox1.Width, PaintBox1.Height));
      MoveTo(ax-3,ay-3);
      LineTo(ax+3,ay-3);
      LineTo(ax+3,ay+3);
      LineTo(ax-3,ay+3);
      LineTo(ax-3,ay-3);
    End;
end;

procedure TForm2.NextStep(var ax, ay, av : integer; aa: integer);
begin
  // s = s0 + vt + at^2/2
  ax := ax + 1;
  av := av + aa*x;
  ay := ax*av + round(aa*sqr(x)/2);

  // end trajectory, start again
  if ay < 0 Then
    begin
      ax := 0;
      ay := 0;
      av := 100;
    end;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  NextStep(x,y,v,a);
  DrawObject(x*10,PaintBox1.Height-y); // Reverse y
end;

end.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter