Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Движение по прямой


Автор: ben1992 12.05.08, 13:06
Всем добрый день!
У меня есть проблема, которая уже звучала(на этом форуме тоже), но нормального ответа я никак не могу найти!
Есть объект с координатами x,y. Тыкаем на форму получаем точку X,Y. Уважаемые знатоки, внимание вопрос КАК? мне плавно передвинуть объект из точки x,y в точку X,Y. Видел советы по поводу уравнения прямой и прочее и прочее...., но все приведенные примеры какието глючные! Самому не додумать т.к. незнаю в какую сторону надо думать. То двигает не в ту стророну, то неплавно, то вааще не двигает. :wall: :wall: :wall: Очень прошу дельного совета(или нормально РАБОРТАЮЩЕГО исходного кода).
Заранее спасибо!

Автор: Вуйко з полонини 12.05.08, 13:12
Цитата ben1992 @
Уважаемые знатоки, внимание вопрос КАК? мне плавно передвинуть объект из точки x,y в точку X,Y.

Алгоритм Брезенхейма рисования прямой?

Автор: n0rd 12.05.08, 13:14
Есть две точки, задающие отрезок, есть некоторое количество кадров, за которые необходимо попасть из одной точки в другую. Вычисляем приращения для одного кадра по каждой из осей. Прибавляем в каждом кадре вычисленные приращения к текущим координатам.

Автор: ben1992 12.05.08, 13:16
ОГО оперативно :D . Кстати на форуме часы на час отстают

Добавлено

to Вуйко з полонини
Цитата Вуйко з полонини @
Алгоритм Брезенхейма рисования прямой

Ща будем копать.

to nOrd
Цитата n0rd @
Вычисляем приращения
, а можно пример.

Автор: n0rd 12.05.08, 13:31
Цитата ben1992 @
Кстати на форуме часы на час отстают

Не отстают.


Цитата ben1992 @
а можно пример

Если у вас возникают трудности с этим, может вам стоить начать с чего попроще? Например, с прямолинейного движения вдоль одной оси?

Автор: ben1992 12.05.08, 13:49
to nOrd
Во разобрался(не совсепм тупой как могло показатся)
Получилось так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if(X2>X1 && Y2>Y1)
    {
     x=x+(X2-X1)/10;
     y=y+(Y2-Y1)/10;
       if(X2<X1 && Y2<Y1)
       {
       Timer2->Enabled=false;
       }
    }
     
     
     
     
    if(X2<X1 && Y2<Y1)
    {
     x=x-(X1-X2)/10;
     y=y-(Y1-Y2)/10;
         if(X2>X1 && Y2>Y1)
         {
         Timer2->Enabled=false;
         }
    }

Тока что бы взять за магическое число 10, а то не совсем красиво получается?

Автор: Вуйко з полонини 12.05.08, 13:59
ben1992, смотри, ежели всё совсем просто, то надо делать так. Ксть у тебя точки (x1 y1) (x2 y2)

Общее уравнение прямой y=kx+b можно вывести из (y-y1)/(y2-y1)=(x-x1)/(x2-x1), в частности

k=(y2-y1)/(x2-x1)

Автор: n0rd 12.05.08, 14:02
Цитата ben1992 @
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if(X2>X1 && Y2>Y1)
    //....
    if(X2<X1 && Y2<Y1)

Гы. А если (X2>X1 && Y2<Y1) или наоборот? :) Напишете еще два if'а?


Цитата ben1992 @
Тока что бы взять за магическое число 10, а то не совсем красиво получается?

Зависит от того, чего вы хотите добиться. Если достижение цели за 10 кадров, то так и оставьте; если перемещения с постоянной скоростью, то надо вычислить длину отрезка и поделить на желаемую скорость.

Автор: ben1992 12.05.08, 14:15
Все всем спасибо за внимание разобрался. Вот код, авось пригодится
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     nn=10;
    if(X2>X1 && Y2>Y1)
    {
     
     x=x+(X2-X1)/nn;
     y=y+(Y2-Y1)/nn;
       if(X2<X1 && Y2<Y1)
       {
       Timer2->Enabled=false;
       }
    }
    if(X2<X1 && Y2<Y1)
    {
     x=x-(X1-X2)/nn;
     y=y-(Y1-Y2)/nn;
         if(X2>X1 && Y2>Y1)
         {
         Timer2->Enabled=false;
         }
    }
    if(X2<X1 && Y2>Y1)
    {
     x=x-(X1-X2)/nn;
     y=y+(Y2-Y1)/nn;
         if(X2>X1 && Y2<Y1)
         {
         Timer2->Enabled=false;
         }
     
    }
    if(X2>X1 && Y2<Y1)
    {
     x=x+(X2-X1)/nn;
     y=y-(Y1-Y2)/nn;
         if(X2<X1 && Y2>Y1)
         {
         Timer2->Enabled=false;
         }
    }


Добавлено
Цитата n0rd @
Напишете еще два if'а?
А почему бы и нет? Два не двадцать два :D :D :D .

Автор: n0rd 12.05.08, 14:46
Оканчивать анимацию имеет смысл когда были воспроизведены все кадры, а не по вашим странным условиям :) В общем случае ее надо заканчивать когда мы перестаем приближаться к целевой точке.



Цитата ben1992 @
А почему бы и нет? Два не двадцать два

Хы, а если вам потребуется написать то же самое для трехмерного случая?

Автор: Serex 12.05.08, 14:51
Предлагаю заранее вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле, но тогда в тело цикла нужно вводить задержку по времени.

Добавлено
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if(i<nn) {
     x=x+dx;
     y=k*x+b;
     i++;
    }

x,y - текущие координаты
dx = X2-X1/nn - виличина приращения
nn - количество приращений
k,b - коэффициенты, вычисляемые по формулам заранее которые выводяться из системы
Y1=k*X1+b
Y2=k*X2+b

i - иттерационная переменная

:rolleyes: Правда проще получиться ?

Добавлено
А еще я умею равномерно двигать объекты по окружности :rolleyes:

Автор: ben1992 12.05.08, 16:12
Цитата n0rd @
а не по вашим странным условиям
Согласен условия странные, выведенные при помощи бумажки с ручкой и системы координат, но факт остаётся фактом, все замечательнол работает, а мне это и надо.


Цитата Serex @
вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле
+задержка по времени :blink: , помоему мой тупой вариант с кучей условий будет проще. :)

Цитата Serex @
А еще я умею равномерно двигать объекты по окружности
ну чтож молодец ;) .

Ладно, главное что все получилось и работает ;) . Serex, nOrd ,Вуйко з полонини, всем спасибо за помощь.

Автор: Serex 13.05.08, 07:15
Цитата ben1992 @
Цитата (Serex @ Вчера, 17:51)
вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле
+задержка по времени , помоему мой тупой вариант с кучей условий будет проще.

Ну ну, а если у тебя допустим 100 или 1000 итераций, вычислить один раз параметры или проверять кучу условий 100 или 1000 раз?
А потом в твоем коде не доработка, объект переместиться в другую точку а не ту которую хотел. Могу объянить почему....

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