Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с графикой!!! 
:(
    Опции темы
Shad-X
Дата 23.5.2005, 22:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите пожалуйста, как заставить нарисованный в форме круг двигаться с определенной скоростью? Пользователь задает координаты 2х точек и скорость. И кружочек должен перемещаться между этими точками с заданной скоростью! Как мне все это учесть и рассчитать? Нужно ли для этого использовать Таймер, если да, то как? Заранее благодарен! smile
  Вверх
Snowy
Дата 24.5.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Можешь с таймером, можешь без него.
С таймером проще.
Принцип простой.
Код

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.

PM MAIL   Вверх
Shadex
Дата 24.5.2005, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 23.5.2005

Репутация: нет
Всего: 1



Спасибо большое! хотя ещё не совсем разобрался, но надеюсь за ночь напишу! =)
PM MAIL   Вверх
Гость_welt
Дата 27.5.2005, 15:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Давай разбираться.
Смотри, можно например, написать уравнение двидения для шарика.
x=x0+vt y=sqrt(L*L-(vt+x0)^2). Но можно проще.
--Resize_Images_Alt_Text--
Пишеш уравнение прямой А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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 30.6.2005

Репутация: нет
Всего: нет



А зачем каждый раз прорисовывать окружность, если можно перемещать сам Image1?
PM MAIL   Вверх
Snowy
Дата 30.6.2005, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



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

одну из точек принимать за (0,0), а потом просто к обеим прибавлять смещение для отрисовки.
Только это уже не актуально. Человеку это уже не нужно - месяц прошел.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.