1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
typedef std::pair<double,double> PointDuGraphe;
typedef std::vector<PointDuGraphe> Spectre;
typedef std::vector<PointDuGraphe> Graphe;
void GestionnaireNonThread::calculDeltaMax( Graphe & outGrapheDeltaMax, double & outDeltaDSRF )
{
// récupérer le tableau de spectres
QSharedPointer<std::vector<Spectre>> tempSpectre = QSharedPointer<std::vector<Spectre>>( new std::vector<Spectre>() );
tempSpectre = _donnees.getTableauDesSpectres();
// récupérer le nombre de spectres
int nbSpectres = tempSpectre->size();
// vérifier qu'il y a bien + qu'un seul spectre
if( nbSpectres > 0 )
{
// vérifier que tous les spectres ont la même dimension en X
// récupération de la taille du premier spectre
int tempTaille = tempSpectre->at(0).size();
for( int i=1; i < nbSpectres ;++i )
{
if( tempSpectre->at(i).size() != tempTaille )
throw MessageManagement::Error( MSG_CODE_LOCATION(), "Impossible de calculer le delta max des graphes car ils n'ont pas la même dimension en X." );
}
// On redimensionne la variable outGrapheDeltaMax
outGrapheDeltaMax.resize( tempTaille );
// calculer le delta max
double valAmplitudeMin = 0., valAmplitudeMax = 0.;
std::vector<double> tempValeurAmplitudePourUneLongueurDOnde;
tempValeurAmplitudePourUneLongueurDOnde.resize( nbSpectres, 0. );
for( int iLongueurDOnde = 0; iLongueurDOnde< tempTaille; ++iLongueurDOnde )
{
// boucle sur chaque longueur d'onde
// on remplit la partie X de la variable outGrapheDeltaMax
outGrapheDeltaMax.at( iLongueurDOnde ).first = tempSpectre->at(0).at( iLongueurDOnde ).first;
// on crée un tableau avec toutes les valeurs d'amplitude pour une longueur d'onde donnée
for( int iSpectre = 0; iSpectre < nbSpectres; ++ iSpectre )
tempValeurAmplitudePourUneLongueurDOnde.at(iSpectre) = tempSpectre->at(iSpectre).at( iLongueurDOnde ).second;
// calcul du min et du max du tableau
FonctionsGeneriques::calculMinMaxTabDouble( tempValeurAmplitudePourUneLongueurDOnde, valAmplitudeMin, valAmplitudeMax );
// calcul du delta
outGrapheDeltaMax.at( iLongueurDOnde ).second = abs( valAmplitudeMax - valAmplitudeMin );
// sauvegarde dans les données
_donnees.setDeltaMaxFonctionLongueurDOnde( outGrapheDeltaMax) ;
_donnees.setDeltaDsrf( outDeltaDSRF );
}
}
}
bool FonctionsGeneriques::calculMinMaxTabDouble( const std::vector<double> & inTableau, double & outMin, double & outMax )
{
bool res = true;
size_t nbPoint = inTableau.size();
if( nbPoint != 0 )
{
outMin = inTableau.at(0);
outMax = inTableau.at(0);
for( unsigned int i=0; i<nbPoint; ++i )
{
double tempValue = inTableau.at(i);
if( tempValue < outMin )
outMin = tempValue;
else if( tempValue > outMax )
outMax = tempValue;
}
}
else
{
res = false;
outMin = 0., outMax = 0.;
throw MSG_CATCH( "On ne peut pas calculer le min et le max du tableau car sa taille est nulle" );
}
return res;
} |
Partager