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; }
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; }
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; }