Название: Перемещение графического примитива в окне формы. Отправлено: captan от Июнь 13, 2012, 20:06 Переместить графический примитив (прямоугольник) из точки x1 в точку x2 по кратчайшей траектории. Например, точка x1(0,0), а другая точка устанавливается кнопкой мыши, например, x2(350,420). Анимация перемещения прямоугольника осуществляется при помощи таймера в paintEvent. Вот отрывок кода:
void Player::movePlayer(bool go) { if(go) { //mPlayerXPos, mPlayerYPos - начальные координаты //mPlayerXDestPos, mPlayerYDestPos - координаты от мыши, куда должен переместиться прямоугольник if(mPlayerXDestPos > mPlayerXPos) { mPlayerXPos+=mSpeedX; } if(mPlayerXDestPos < mPlayerXPos) { mPlayerXPos-=mSpeedX; } if(mPlayerYDestPos > mPlayerYPos) { mPlayerYPos+=mSpeedY; } if(mPlayerYDestPos < mPlayerYPos) { mPlayerYPos-=mSpeedY; } } if((mPlayerXDestPos == mPlayerXPos)&& (mPlayerYDestPos == mPlayerYPos)) { mGo=false; } } Прямоугольник перемещается в указанную точку, но не по прямой. Как добиться чтобы при любом угле прямой линии, объект перемещался в точку назначения по кратчайшей траектории? Название: Re: Перемещение графического примитива в окне формы. Отправлено: Kurles от Июнь 13, 2012, 21:28 Алгоритм Брезенхема (http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%85%D1%8D%D0%BC%D0%B0#.D0.A0.D0.B5.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F_.D0.BD.D0.B0_C.2B.2B).
Название: Re: Перемещение графического примитива в окне формы. Отправлено: twp от Июнь 14, 2012, 14:41 наверно проще будет прикрутить QVariantAnimation
Название: Re: Перемещение графического примитива в окне формы. Отправлено: Igors от Июнь 14, 2012, 15:28 Целые числа не очень подходят - ошибка округления накапливается. Да и написано как-то рыхло. Лучше напр так
Код
Название: Re: Перемещение графического примитива в окне формы. Отправлено: captan от Июнь 14, 2012, 18:09 Попробовал Алгоритм Брезенхема.
Вот код функции которая постоянно вызывается в paintEvent'е по таймеру: Код: void Player::movePlayer(bool go) -------------------------- Igors непонятны float mBegT, mEndT; // время начала и конца. У меня таймер постоянно обновляет виджет. -------------------------- twp ваш вариант пока изучаю. Название: Re: Перемещение графического примитива в окне формы. Отправлено: twp от Июнь 14, 2012, 21:19 да, имхо самый простой способ и не нужно c таймером заморачиваться. К тому же можно ипользовать разные виды интерполяций (см. свойство QVariantAnimation::easingCurve). Есть хорошая демка, демонстирующая интерполяцию при перемещении в QTDIR/examples/animation/easing/
Название: Re: Перемещение графического примитива в окне формы. Отправлено: Igors от Июнь 15, 2012, 09:17 Igors непонятны float mBegT, mEndT; // время начала и конца. У меня таймер постоянно обновляет виджет. Вы напрасно используете скорость, она неустойчива. Цель - точка должна прийти в заданную за какое-то время, которое известно/задается. Ну и пусть конструктор сохранит этот интервал в членах классаbegT = QTime::currentTime() endT = begT + moveTime А текущее время можно получить тем же currentTime(), хотя и таймер его знает Название: Re: Перемещение графического примитива в окне формы. Отправлено: captan от Сентябрь 05, 2012, 19:50 Получился следующий код с использованием алгоритма Брезенхэма:
Код: #include "window.h" Код: #include "player.h" |