Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Движение объекта   Найти похожие ветки 

 
novai   (2012-03-17 10:35) [0]

Как в таймере переместить объект из точки (X1, Y1) в точку (X2, Y2) с нужным шагом?


 
begin...end ©   (2012-03-17 10:35) [1]

Какой объект?


 
novai   (2012-03-17 10:36) [2]

например tlable...


 
novai   (2012-03-17 10:39) [3]

поясню, нужна визуализация движения объекта из одной точки в другую...


 
Dimka Maslov ©   (2012-03-17 10:52) [4]

Заданием св-в Left и Top


 
novai   (2012-03-17 10:54) [5]

да, я понял про эти переменные.
я не могу понять, как расчитать шаг, чтобы в таймере его прибавлять для left и top и в итоге придти в точку 2


 
begin...end ©   (2012-03-17 10:55) [6]

В чём же проблема? В событии OnTimer вычисляйте новые координаты объекта, прибавляя к старым (Label.Left, Label.Top) величину шага. Если новые координаты таковы, что точка (X2, Y2) ещё не достигнута, назначайте их объекту. Если же она достигнута, выключайте таймер.


 
begin...end ©   (2012-03-17 10:56) [7]

> novai   (17.03.12 10:54) [5]

Из точки 1 в точку 2 можно перейти по различным траекториям.


 
novai   (2012-03-17 11:10) [8]


> прибавляя к старым (Label.Left, Label.Top) величину шага

если я прибавляю 1, то уезжаю вправо вниз под углом 45 и не могу придти в точку 2... значит прибавлять надо не 1, вот я и не могу расчитать этот число...


 
novai   (2012-03-17 11:10) [9]


>  перейти по различным траекториям.

нужна траектория, для наиболее быстрого перехода из точки 1 в точку 2


 
begin...end ©   (2012-03-17 11:18) [10]

> novai   (17.03.12 11:10) [9]

Это прямая. Уравнение прямой: Y = K * X + B. Если прямая проходит через точки (X1, Y1) и (X2, Y2), то K = (Y1 - Y2) / (X1 - X2) и B = Y1 - K * X1. В таймере изменяйте X на величину шага, Y вычисляйте по уравнению прямой. Только придётся округлять до целых.


 
Inovet ©   (2012-03-17 11:23) [11]

> [10] begin...end ©   (17.03.12 11:18)
> Только придётся округлять до целых.

И расчитывать от прошедшего времени и от начльных координат. Т.е. к уравнению прямой добавить время и получится уравнение движения.


 
novai   (2012-03-17 11:33) [12]

а где в byte дробная часть? я ее не вижу


 
novai   (2012-03-17 11:36) [13]

или его округлять не нужно?


 
begin...end ©   (2012-03-17 11:52) [14]

> novai   (17.03.12 11:33) [12]
Я не понимаю, о чём Вы.

На форме - два компонента TLabel и один таймер. Код:

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   Timer1: TTimer;
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   K, B: Real;
   ToRight: Boolean;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 K := (Label1.Top - Label2.Top) / (Label1.Left - Label2.Left);
 B := Label1.Top - K * Label1.Left;
 ToRight := Label1.Left < Label2.Left
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const
 XStep = 10;
var
 NewLeft: Integer;
begin
 if ToRight then
   NewLeft := Label1.Left + XStep
 else
   NewLeft := Label1.Left - XStep;
 if (ToRight and (NewLeft <= Label2.Left)) or (not ToRight and (NewLeft >= Label2.Left)) then
   with Label1 do
   begin
     Left := NewLeft;
     Top := Trunc(K * NewLeft + B)
   end
 else
   (Sender as TTimer).Enabled := False
end;


 
novai   (2012-03-17 12:04) [15]

Спасибо огромное, это и было нужно.


 
Inovet ©   (2012-03-17 12:06) [16]

> [15] novai   (17.03.12 12:04)
> это и было нужно.

Код выманил-таки.:)


 
Inovet ©   (2012-03-17 12:08) [17]

Только ошибка будет накапливаться, так что дальше сам доделай, как говорилось в

> [11] Inovet ©   (17.03.12 11:23)


 
begin...end ©   (2012-03-17 12:18) [18]

Да, я предположил, что шаг по X - целый. В этом случае накопления ошибки не будет.


 
CRLF   (2012-03-17 12:25) [19]

не лучше ли параметрическим заданием прямой пользоваться?


 
Anatoly Podgoretsky ©   (2012-03-17 12:45) [20]

LineDDA


 
selesasha   (2012-03-17 12:50) [21]

//Длина отрезка
Length:=sqrt(sqr(y2-y1)+sqr(x2-x1));

//Вектор приращения
dX:=(x2-x1)/Length;
dY:=(y2-y1)/Length;

В таймере проверяете не переместился ли объект в нужную точку, если нет то прибавляете приращение к текущим координатам.

Для координат лучше иметь отдельные переменные вещественного типа, и все операции проводить с ними, при выводе уже округлять.


 
novai   (2012-03-17 15:30) [22]

Переделал вот так, вроде работает:

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   Label1: TLabel;
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   x, y, x1, y1,x2,y2,
   dx, dy, l: real;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 x1:= 300; y1:= 300;
 x2:= 200; y2:= 50;

//&#196;&#235;&#232;&#237;&#224; &#238;&#242;&#240;&#229;&#231;&#234;&#224;
L:=sqrt(sqr(y2-y1)+sqr(x2-x1));

//&#194;&#229;&#234;&#242;&#238;&#240; &#239;&#240;&#232;&#240;&#224;&#249;&#229;&#237;&#232;&#255;
dX:=(x2-x1)/L;
dY:=(y2-y1)/L;

x:= x1;
y:= y1;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 x:= x + dx;
 y:= y + dy;

 label1.Left:= Round(x);
 label1.Top:= Round(y);

 canvas.Rectangle(round(x1), round(y1), round(x2), round(y2));

 if (label1.Left = x2) and (label1.Top = y2) then Timer1.Enabled:= false;
end;


проблемм быть не должно?


 
novai   (2012-03-17 15:38) [23]

и еще вопрос, как можно увеличить скорость движения в 22?


 
novai   (2012-03-17 16:05) [24]

А, понял

> XStep = 10;

и есть шаг... на этом и остановлюсь



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.054 c
2-1340633585
webpauk
2012-06-25 18:13
2013.03.22
Изменение TabSheet.Caption


2-1345708838
Molchanov
2012-08-23 12:00
2013.03.22
Высокоскоростной обмен с аппаратурой


15-1338529424
alexdn
2012-06-01 09:43
2013.03.22
Куда выложить


15-1351684728
Inovet
2012-10-31 15:58
2013.03.22
И Яндекс не остался в стороне от браузеростроения


1-1295810591
Nikfel
2011-01-23 22:23
2013.03.22
Как узнать параметры запуска процесса?