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)); 
} 
示例#2
0
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;
}