void updateScene() { GLfloat xDelta, zDelta; GLfloat rotation; GLfloat sin_steering, cos_steering; if (-INC_SPEED < speed && speed < INC_SPEED) return; if(speed < 0.0f) pedalAngle = speed = 0.0f; xDelta = speed*cos(radians(direction + steering)); zDelta = speed*sin(radians(direction + steering)); xpos += xDelta; zpos -= zDelta; pedalAngle = degrees(angleSum(radians(pedalAngle), speed/RADIUS_WHEEL)); sin_steering = sin(radians(steering)); cos_steering = cos(radians(steering)); rotation = atan2(speed * sin_steering, CYCLE_LENGTH + speed * cos_steering); direction = degrees(angleSum(radians(direction),rotation)); }
bool AngleTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { DEBUG_FUNC_NAME int row = index.row(); int column = index.column(); int numAngles = angles_->count(); if (!index.isValid() || (role != Qt::EditRole && role != Qt::CheckStateRole) || row < 0 || row >= numAngles || column < 0 || column >= MaxColumns) { qDebug() << "setData init tests failed"; return false; } qDebug() << "setData init tests passed"; AngleItem item = angles_->value(row); int nextRow = (row + 1) % numAngles; AngleItem nextItem = angles_->value(nextRow); if (role == Qt::EditRole) { qDebug() << "EditRole"; switch (column) { case DEGREES: { bool ok; double angle = value.toDouble(&ok); double currAngle = item.angle_; double currAngleSum = angleSum(); double followingAngle = nextItem.angle_; qDebug() << "angle" << angle; qDebug() << "currAngle" << currAngle; qDebug() << "currAngleSum" << currAngleSum; qDebug() << "followingAngle" << followingAngle; if (angle > MaxDegrees) angle = MaxDegrees; if (numAngles > 1) { if (!ok || angle < MinDegrees) return false; // equal to 360 degrees if (qFuzzyCompare(currAngleSum, MaxDegrees)) { qDebug() << "currAngleSum" << currAngleSum; // eat following if (angle <= (currAngle + followingAngle)) { qDebug() << "eat following"; nextItem.angle_ = followingAngle - (angle - currAngle); } // eat all following but no more else { qDebug() << "eat all"; angle = currAngle + followingAngle; nextItem.angle_ = 0.0; } qDebug() << "row" << row; // set offset on first angle if (row == (numAngles - 1)) { qDebug() << "last row"; setOffset(offset_ + (followingAngle - nextItem.angle_)); } } // lesser than 360 degrees else if (currAngleSum < MaxDegrees) { // fill up to 360 if (angle > (MaxDegrees - (currAngleSum - currAngle))) { angle = MaxDegrees - (currAngleSum - currAngle); qDebug() << "angleSum()" << currAngleSum; qDebug() << "max ANGLE" << angle; } else { qDebug() << "normal ANGLE" << angle; } } // greater than 360 degrees else { qDebug() << "angleSum()" << currAngleSum; qDebug() << "to be prevented"; } } // one angle only else { nextItem.angle_ = angle; } item.angle_ = angle; break; } default: Q_ASSERT(false); } } if (role == Qt::CheckStateRole) { qDebug() << "CheckStateRole"; switch (column) { case DEGREES: { qDebug() << "1 item.included_" << item.included_; Qt::CheckState included = static_cast<Qt::CheckState>(value.toUInt()); item.included_ = included; qDebug() << "2 item.included_" << item.included_; qDebug() << "2 included" << included; break; } default: Q_ASSERT(false); } } angles_->replace(row, item); angles_->replace(nextRow, nextItem); if (!skipPruning_) pruneEmptyRows(); emit modified(); emit dataChanged(index, index); return true; }