Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Проблема с графикой!!!


Автор: Shad-X 23.5.2005, 22:05
Подскажите пожалуйста, как заставить нарисованный в форме круг двигаться с определенной скоростью? Пользователь задает координаты 2х точек и скорость. И кружочек должен перемещаться между этими точками с заданной скоростью! Как мне все это учесть и рассчитать? Нужно ли для этого использовать Таймер, если да, то как? Заранее благодарен! smile

Автор: Snowy 24.5.2005, 16:27
Можешь с таймером, можешь без него.
С таймером проще.
Принцип простой.
Код

var
  x,y: integer; // координаты центра
  r:  integer; // радиус
  rx,ry: real; // отклонение от центра
  sp: real; // скорость
  dx: real; // смещение по x

Во-первых скорость нужно спроецировать на x:
rx:=rx/pi;

Далее по таймеру:
Код

OnTimer;
begin
  dx:=dx+sp;
  if dx>(r*2) then dx:=0;
  rx:=cos(dx)*r+x;
  ry:=(sin(dx)*r+y) * a;
end;

Тут я не описываю a - это коэффициент отклонения от горизонта.
Его можно вычислить из прямоугольного треугольника, образованными двумя точками и проекциями на оси.
Надеюсь, что не перепутал x и y.

Автор: Shadex 24.5.2005, 20:59
Спасибо большое! хотя ещё не совсем разобрался, но надеюсь за ночь напишу! =)

Автор: Гость_welt 27.5.2005, 15:51
Давай разбираться.
Смотри, можно например, написать уравнение двидения для шарика.
x=x0+vt y=sqrt(L*L-(vt+x0)^2). Но можно проще.
http://lic1560.narod.ru/hxhy.gif
Пишеш уравнение прямой АB, где А и B твои точки.
Как уже гоаорилось выше, у тебя будет прямоугольный треугольник.
Поэтому например можно разбить обну из его сторон на несколько частей,
т.е получить шаг, с которым будем перемещаться по оси ОХ, затем, подставляя этот постоянный шаг в уравнение АВ, будем получать переменный шаг по оси ОУ.
(см. рисунок)
Далее с этим шагом в цикле рисуешь шарик
Кстати, скорость будет зависеть от числа, на которое разобьешь отрезок..
А вот, чтобы использовать таймер. Напиши процедуру Delay вот как..

Код

public
  procedure Delay(msecs : Longint);
...........

procedure TForm1.Delay(msecs : Longint);
var
   FirstTick : longint;
begin
     FirstTick:=GetTickCount;
     repeat    
       Application.ProcessMessages; {ДМС ФПЗП ЮФПВЩ ОЕ "ЪБЧЕУЙФШ" Windows}
     until GetTickCount-FirstTick >= msecs;
end;





Получится примерно следующее.
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
 var i,j,x0,v,t,Hx,Hy:integer;
begin
// Image1.Canvas.ellipse(60-1,5-1,60+1,5+1) ;
 xa:=0;//Коорддинаты точки А
 ya:=0;
 xb:=70;//Координаты точки В
 yb:=110;
 Hx:=round((xb-xa)/10);
 Hy:=round((Hx-xa)*(yb-ya)/(xb-xa))+ya;
 Image1.Canvas.Brush.Style:=bsSolid;
 Image1.Canvas.Brush.Color:=clwhite;
 Image1.Canvas.ellipse(xb-1,yb-1,xb+1,yb+1) ;
  for i:=1 to 10 do
   begin
    Hy:=round((Hx-xa)*(yb-ya)/(xb-xa))+ya;
    ya:=ya+Hy;
    xa:=xa+Hx;
    Image1.Canvas.Pen.Color:=clRed;
    Image1.Canvas.ellipse(xa-5,ya-5,xa+5,ya+5) ;
    delay(900);
    Image1.Canvas.Pen.Color:=clwhite;
    Image1.Canvas.ellipse(xa-5,ya-5,xa+5,ya+5) ;
   end;
 Image1.Canvas.Pen.Color:=clRed;
Image1.Canvas.ellipse(xa-5,ya-5,xa+5,ya+5) ;
end;


У меня получилось сделать, только когда xa=0 и xb=0, а координа ты второй точки произвольны, уж сам разбирешься как исправить..

Автор: dux 30.6.2005, 13:05
А зачем каждый раз прорисовывать окружность, если можно перемещать сам Image1?

Автор: Snowy 30.6.2005, 14:36
А зачем вообще было поднимать старую тему?
Цитата
У меня получилось сделать, только когда xa=0 и xb=0

одну из точек принимать за (0,0), а потом просто к обеим прибавлять смещение для отрисовки.
Только это уже не актуально. Человеку это уже не нужно - месяц прошел.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)