Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.2.15] |
|
Сообщ.
#1
,
|
|
|
Всем добрый день!
У меня есть проблема, которая уже звучала(на этом форуме тоже), но нормального ответа я никак не могу найти! Есть объект с координатами x,y. Тыкаем на форму получаем точку X,Y. Уважаемые знатоки, внимание вопрос КАК? мне плавно передвинуть объект из точки x,y в точку X,Y. Видел советы по поводу уравнения прямой и прочее и прочее...., но все приведенные примеры какието глючные! Самому не додумать т.к. незнаю в какую сторону надо думать. То двигает не в ту стророну, то неплавно, то вааще не двигает. Очень прошу дельного совета(или нормально РАБОРТАЮЩЕГО исходного кода). Заранее спасибо! |
Сообщ.
#2
,
|
|
|
Цитата ben1992 @ Уважаемые знатоки, внимание вопрос КАК? мне плавно передвинуть объект из точки x,y в точку X,Y. Алгоритм Брезенхейма рисования прямой? |
Сообщ.
#3
,
|
|
|
Есть две точки, задающие отрезок, есть некоторое количество кадров, за которые необходимо попасть из одной точки в другую. Вычисляем приращения для одного кадра по каждой из осей. Прибавляем в каждом кадре вычисленные приращения к текущим координатам.
|
Сообщ.
#4
,
|
|
|
ОГО оперативно . Кстати на форуме часы на час отстают
Добавлено to Вуйко з полонини Цитата Вуйко з полонини @ Алгоритм Брезенхейма рисования прямой Ща будем копать. to nOrd Цитата n0rd @ , а можно пример. Вычисляем приращения |
Сообщ.
#5
,
|
|
|
Цитата ben1992 @ Кстати на форуме часы на час отстают Не отстают. Цитата ben1992 @ а можно пример Если у вас возникают трудности с этим, может вам стоить начать с чего попроще? Например, с прямолинейного движения вдоль одной оси? |
Сообщ.
#6
,
|
|
|
to nOrd
Во разобрался(не совсепм тупой как могло показатся) Получилось так: 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, а то не совсем красиво получается? |
Сообщ.
#7
,
|
|
|
ben1992, смотри, ежели всё совсем просто, то надо делать так. Ксть у тебя точки (x1 y1) (x2 y2)
Общее уравнение прямой y=kx+b можно вывести из (y-y1)/(y2-y1)=(x-x1)/(x2-x1), в частности k=(y2-y1)/(x2-x1) |
Сообщ.
#8
,
|
|
|
Цитата ben1992 @ if(X2>X1 && Y2>Y1) //.... if(X2<X1 && Y2<Y1) Гы. А если (X2>X1 && Y2<Y1) или наоборот? Напишете еще два if'а? Цитата ben1992 @ Тока что бы взять за магическое число 10, а то не совсем красиво получается? Зависит от того, чего вы хотите добиться. Если достижение цели за 10 кадров, то так и оставьте; если перемещения с постоянной скоростью, то надо вычислить длину отрезка и поделить на желаемую скорость. |
Сообщ.
#9
,
|
|
|
Все всем спасибо за внимание разобрался. Вот код, авось пригодится
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'а? |
Сообщ.
#10
,
|
|
|
Оканчивать анимацию имеет смысл когда были воспроизведены все кадры, а не по вашим странным условиям В общем случае ее надо заканчивать когда мы перестаем приближаться к целевой точке.
Цитата ben1992 @ А почему бы и нет? Два не двадцать два Хы, а если вам потребуется написать то же самое для трехмерного случая? |
Сообщ.
#11
,
|
|
|
Предлагаю заранее вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле, но тогда в тело цикла нужно вводить задержку по времени.
Добавлено 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 - иттерационная переменная Правда проще получиться ? Добавлено А еще я умею равномерно двигать объекты по окружности |
Сообщ.
#12
,
|
|
|
Цитата n0rd @ Согласен условия странные, выведенные при помощи бумажки с ручкой и системы координат, но факт остаётся фактом, все замечательнол работает, а мне это и надо.а не по вашим странным условиям Цитата Serex @ +задержка по времени , помоему мой тупой вариант с кучей условий будет проще. вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле Цитата Serex @ ну чтож молодец .А еще я умею равномерно двигать объекты по окружности Ладно, главное что все получилось и работает . Serex, nOrd ,Вуйко з полонини, всем спасибо за помощь. |
Сообщ.
#13
,
|
|
|
Цитата ben1992 @ Цитата (Serex @ Вчера, 17:51) вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле +задержка по времени , помоему мой тупой вариант с кучей условий будет проще. Ну ну, а если у тебя допустим 100 или 1000 итераций, вычислить один раз параметры или проверять кучу условий 100 или 1000 раз? А потом в твоем коде не доработка, объект переместиться в другую точку а не ту которую хотел. Могу объянить почему.... |