Beispiel #1
0
float PolarDiagram::getGybeAngle(const float & speed){
    if(!contains(speed)){
        if(debug)
            qDebug() << Q_FUNC_INFO << QString("(%1): speed not found").arg(QString::number(speed));

        int i = 0;
        // List of all the speeds available in the diagram
        // given in ASC order
        QList<float> speeds = diagram.keys();

        while(speeds[i] < speed && i < speeds.size() - 1)
            ++i;

        float maxang;

        // input speed is bigger than any available
        if(i == speeds.size() - 1)
            maxang = getGybeAngle(speeds.last());
        // input speed is smaller than any available
        else if (i == 0)
            maxang = getGybeAngle(speeds.first());
        // input speed is between other available speeds
        else
            maxang = (getGybeAngle(speeds[i-1]) + getGybeAngle(speeds[i])) / 2;

        return maxang;
    }

    // input speed is contained in our diagram
    Angles aux = getAngles(speed);

    // List of available angles for this speed
    // List is in ASC order
    QList<float> angles = aux.keys();

    float maxta = 0, maxang = 0, ta, ang;
    bool on_gybe = true;

    for(int i = angles.size() - 1; on_gybe && i >= 0; --i){
        ang = angles[i];
        ta = aux.value(ang);

        if(ang < MIN_ANGLE_CONSIDERED_GYBE)
            on_gybe = false;
        else
            if(ta > maxta){
                maxta = ta;
                maxang = ang;
            }
    }

    if(debug)
        qDebug() << Q_FUNC_INFO << QString("(%1): %2").arg(QString::number(speed), QString::number(maxang));

    return maxang;
}
Beispiel #2
0
float PolarDiagram::getTA(const float & speed, const float & angle){
    if(!contains(speed)){
        int i = 0;
        // List of ALL the speeds avilable in de diagram
        // given in ASC order
        QList<float> speeds = diagram.keys();

        while(speeds.at(i) < speed && i < speeds.size() - 1)
            ++i;

        float ta;

        // input speed is bigger than any available
        if(i == speeds.size() - 1)
            ta = getTA(speeds.last(), angle);
        // input speed is smaller than any available
        else if(i == 0)
            ta = getTA(speeds.first(), angle);
        // input speed is between other available speeds
        else
            ta = (getTA(speeds.at(i - 1), angle) + getTA(speeds.at(i), angle)) / 2;

        return ta;
    }

    // input speed is contained in our diagram
    Angles aux = getAngles(speed);

    // List of available angles for this speed
    // List is in ASC order
    QList<float> angles = aux.keys();

    int i = 0;

    while(angles.at(i) < angle && i < angles.size() - 1)
        ++i;

    // input angle is bigger than any available
    if(i == angles.size() - 1)
        return aux.value(angles.last());
    // input angle is smaller than any available
    else if(i == 0)
        return aux.value(angles.first());
    // input angle is between other available angles
    else
        return (aux.value(angles.at(i - 1)) + aux.value(angles.at(i))) / 2;
}
Beispiel #3
0
UP_ERROR PolarDiagram::check(){
    if(debug)
        qDebug() << Q_FUNC_INFO;

    if(name.isEmpty())
        return ERROR_PD_NAME;
    if(diagram.size() == 0)
        return ERROR_PD_SIZE;

    QList<float> speeds = diagram.keys();

    for(int i = 0; i < speeds.size(); i++){
        // for each speed we check the list of angles-ta
        // very simple not in deep check of the diagram
        Angles aux = getAngles(speeds[i]);
        QList<float> angles = aux.keys();

        bool a_gybe_angle = false;
        bool a_beat_angle = false;
        float ang, ta;

        for(int j = 0; j < angles.size(); j++){
            ang = angles[j];
            ta = aux.value(ang);

            if(ang < MAX_ANGLE_CONSIDERED_BEAT)
                a_beat_angle = true;
            else if(ang > MIN_ANGLE_CONSIDERED_GYBE)
                a_gybe_angle = true;
            // just check if TA is a reasonable value
            if(ta < MIN_TA_ALLOWED || ta > MAX_TA_ALLOWED)
                return ERROR_PD_TA;
        }
        // at least one beat angle and one gybe angle
        // is required in each list of angles-ta
        if(!a_beat_angle || !a_gybe_angle)
            return ERROR_PD_ANG;
    }
    return ERROR_NONE;
}