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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 20:12   #1
ros.pro
Пользователь
 
Регистрация: 24.05.2011
Сообщений: 39
По умолчанию Переместить timage по кривой

Доброго времени суток!
Столкнулся вот с какой проблемой:
Нужно переместить timage по траектории кривой линии.
Т.е. пользователь кликает мышкой на форме, и timage должна ползти к этим координатам. Чтобы лучше представить, это аналог lineto,moveto, только вместо линии будет картинка ползти по такой же траектории. Вопрос в том как заставить ее это делать? А именно, правильно рассчитать ее координаты... lineto, moveto рассчитывает точки между начальной и конечной автоматически, а как посчитать их для timage?

Заранее спасибо.
ros.pro вне форума Ответить с цитированием
Старый 25.05.2011, 20:26   #2
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Вспомнить геометрию

заведите переменные DestX DestY - координаты куда ползти
DX DY приращение которое будет прибавлятся к текущим координатам каждый определенный промежуток времени

при клике мышой расчитываем DX DY

в таймере прибавляем эти смещения к текущим координатам, в конце желательно делать проверку на минимальное растояние иначе может начать прыгать
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 25.05.2011, 21:57   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

а картинка тол все-таки по прямой будет двигаться =)
вот к примеру если вам из точки 0,0 нужно передвинуть мячик в 50,100
то что получается?
за одно и то же время по Х мячик должен проехать 50 пикселов,
а по У - 100 пикселов.

время возьмем условно - в шагах.
допустим мячик должен передвинуться из 0,0 в 50,100 за 50 шагов.
что это значит?
это значит что за один шаг по Х мячик будет проезжать 50 рх/50 шагов = 1 рх,
а по У - 100 рх / 50 шагов = 2 рх.

т.е. на каждой итерации вы должны к Х прибавлять 1, а к У - 2.
так же точно для любых других координат.


кстати, я для своего объяснения взял две точки - 0,0 и 50,100
в вашем случае, когда вы кликаете по форме это будут точки [текущее положение мячика] и [куда ткнули мышкой]
xrob вне форума Ответить с цитированием
Старый 26.05.2011, 18:05   #4
ros.pro
Пользователь
 
Регистрация: 24.05.2011
Сообщений: 39
По умолчанию

2 Swarog
Нет, в этом случае, как уже сказал xrob, timage будет двигаться прямо, ну или не туда, куда нужно =)

2 xrob
Ваш метод не правильно вычисляет координаты. Хотя при определенных числах он работает.

Как я написал в первом посте, нужно вычислить промежуточные координаты. Их надо вычислять по этой формуле:
Код:
x1+x2/2 и y1+y2/2
число "прыжков", а проще говоря длину отрезка по координатам ищем по этой формуле:
Код:
sqrt(sqr(x1-x2)+sqr(y1-y2))

ps. Кстати, сорри за оффтоп, но как тут репутация начисляется?

Последний раз редактировалось ros.pro; 26.05.2011 в 18:08.
ros.pro вне форума Ответить с цитированием
Старый 26.05.2011, 19:21   #5
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Цитата:
Сообщение от ros.pro Посмотреть сообщение
2 Swarog
Нет, в этом случае, как уже сказал xrob, timage будет двигаться прямо, ну или не туда, куда нужно =)

вот реализация в коде. компонент будет бегать за курсором.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    RadioButton1: TRadioButton;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
    ToX, ToY: integer;
    CurX, CurY, Dx, Dy: real;
  public
    { Public declarations }
  end;

  Const Step = 10;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (sqrt(sqr(curx - tox) + sqr(cury - toy)) < step) then
   begin
    CurX := tox;
    cury := toy;
    RadioButton1.Left := tox - 8;
    RadioButton1.Top := toy - 8;
   end
  else
   begin
    curx := curx + dx;
    cury := cury + dy;
    RadioButton1.Left := round(curx) - 8;
    RadioButton1.Top := round(cury) - 8;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 CurX := RadioButton1.Left - 8;
 CurY := RadioButton1.Top + 8;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 d: real;
begin
 d := sqrt(sqr(curx - X) + sqr(cury - Y))/step;
 dx := (x - curx) / d;
 dy := (y - cury) / d;
 tox := x;
 toy := y;
end;

end.
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение кривой безье. faustinus Помощь студентам 1 26.12.2010 18:02
Кривой synapse? chikaga Работа с сетью в Delphi 2 15.12.2010 12:03
Парсинг страницы с кривой кодировкой gamer123 Общие вопросы Delphi 12 20.09.2010 07:54
Кривой макрос Евгений К. Microsoft Office Excel 1 24.08.2010 18:33
Кривой код Slimbr Помощь студентам 0 10.12.2009 18:13