37 class KineticModelPrivate
45 QPointF deacceleration;
50 KineticModelPrivate();
53 KineticModelPrivate::KineticModelPrivate()
57 , deacceleration(0, 0)
65 , d_ptr(new KineticModelPrivate)
67 connect(&d_ptr->ticker, SIGNAL(timeout()), SLOT(update()));
78 return d_ptr->duration;
88 return d_ptr->position;
98 d_ptr->position.setX( posX );
99 d_ptr->position.setY( posY );
101 int elapsed = d_ptr->timestamp.elapsed();
104 if (elapsed < d_ptr->ticker.interval() / 2) {
108 qreal delta =
static_cast<qreal
>( elapsed ) / 1000.0;
110 QPointF lastSpeed = d_ptr->velocity;
111 QPointF currentSpeed = ( d_ptr->position - d_ptr->lastPosition ) / delta;
112 d_ptr->velocity = 0.2 * lastSpeed + 0.8 * currentSpeed;
113 d_ptr->lastPosition = d_ptr->position;
115 d_ptr->timestamp.start();
125 d_ptr->position.setX( posX );
126 d_ptr->position.setY( posY );
131 return d_ptr->ticker.interval();
136 d_ptr->ticker.setInterval(ms);
144 d->timestamp.start();
145 d->velocity = QPointF(0, 0);
153 const int elapsed = d->timestamp.elapsed();
154 if ( elapsed > 2 * d->ticker.interval() ) {
160 d->deacceleration = d->velocity * 1000 / ( 1 + d_ptr->duration );
161 if (d->deacceleration.x() < 0) {
162 d->deacceleration.setX( -d->deacceleration.x() );
164 if (d->deacceleration.y() < 0) {
165 d->deacceleration.setY( -d->deacceleration.y() );
168 if (!d->ticker.isActive())
172 void KineticModel::update()
176 int elapsed = qMin( d->timestamp.elapsed(), 100 );
177 qreal delta =
static_cast<qreal
>(elapsed) / 1000.0;
179 d->position += d->velocity * delta;
180 QPointF vstep = d->deacceleration * delta;
182 if (d->velocity.x() < vstep.x() && d->velocity.x() >= -vstep.x()) {
183 d->velocity.setX( 0 );
185 if (d->velocity.x() > 0)
186 d->velocity.setX( d->velocity.x() - vstep.x() );
188 d->velocity.setX( d->velocity.x() + vstep.x() );
191 if (d->velocity.y() < vstep.y() && d->velocity.y() >= -vstep.y()) {
192 d->velocity.setY( 0 );
194 if (d->velocity.y() > 0)
195 d->velocity.setY( d->velocity.y() - vstep.y() );
197 d->velocity.setY( d->velocity.y() + vstep.y() );
202 if (d->velocity.isNull()) {
207 d->timestamp.start();
210 #include "kineticmodel.moc"
void positionChanged(qreal lon, qreal lat)
KineticModel(QObject *parent=0)
void setUpdateInterval(int ms)
int updateInterval() const
static const int KineticModelDefaultUpdateInterval
void setPosition(QPointF position)
void jumpToPosition(QPointF position)