Example #1
0
void tirer (float px, float py, int canonx, int canony, int tx[][PRECISIONcailloux], int ty[][PRECISIONcailloux],
            int tableauutile, double *degre, struct DONJON *donjon)
{
	int vitesse = VITESSE;
	float y, x;
	int difx = 0, dify = 0, i = 0, bissectrice = 0;
	int octant = calculoctant(px, py, canonx, canony, &difx, &dify);
	float ecart = 0, ecartinverse = 0;
	x = canonx;
	y = canony;

	*degre = atan2(dify, difx);
	*degre *= 57.296;
	ecart = *degre/90;
	ecartinverse = 1-ecart;

	bissectrice = *degre -45;

	if (bissectrice < 0)
	{
		bissectrice = bissectrice*-1;
	}
	bissectrice = bissectrice *2.5;

	for (i = 0; i < PRECISIONcailloux-bissectrice ; i++)
	{
		if (octant == 1)
		{
			x += ecartinverse*vitesse;
			y -= ecart*vitesse;
		}
		else if (octant == 2)
		{
			x += ecartinverse*vitesse;
			y += ecart*vitesse;
		}
		else if (octant == 3)
		{
			x -= ecartinverse*vitesse;
			y += ecart*vitesse;
		}
		else
		{
			x -= ecartinverse*vitesse;
			y -= ecart*vitesse;
		}

		tx[tableauutile][i] = arrondi(x)- donjon->map.pict.pos.x;
		ty[tableauutile][i] = arrondi(y)- donjon->map.pict.pos.y;


	}
	for(i = PRECISIONcailloux-bissectrice; i < PRECISIONcailloux ; i++)
	{
		tx[tableauutile][i] = tx[tableauutile][PRECISIONcailloux-1-bissectrice];
		ty[tableauutile][i] = ty[tableauutile][PRECISIONcailloux-1-bissectrice];
	}
}
void teste_somme( int bits, double c1, int e1, double c2, int e2 )
 {
  int exact, approx, erreur ;
  exact = arrondi(c1*e1+c2*e2) ;
  approx = multiplie(bits,c1,e1) + multiplie(bits,c2,e2) ;
  erreur = arrondi(1000*double(exact-approx)/exact) ;
  if (erreur<0) { erreur = -erreur ; }
  std::cout
    <<std::right<<std::setw(2)<<bits<<" bits : "
    <<std::left<<exact<<" ~ "<<approx
    <<" ("<<erreur<<"/1000)"<<std::endl ;
 }
void teste_approxime( int bits, double valeur )
 {
  Coef coef ;
  coef.approxime(bits,valeur) ;
  double approximation = coef.approximation() ;
  int erreur = arrondi(100*(valeur-approximation)/valeur) ;
  if (erreur<0) { erreur = -erreur ; }
  std::cout
    <<std::right<<std::setw(2)<<bits<<" bits : "
    <<std::left<<valeur<<" ~ "<<std::setw(8)<<arrondi(approximation,6)
    <<" ("<<erreur<<"/100)"
    <<" ("<<coef.numerateur()<<"/2^"<<coef.exposant()<<")"
    <<std::endl ;
 }
void teste_somme( int bits, double c1, int e1, double c2, int e2 )
 {
  Coef coef1, coef2 ;
  coef1.approxime(bits,c1) ;
  coef2.approxime(bits,c2) ;
  int approx = coef1.multiplie(e1) + coef2.multiplie(e2) ;
  int exact = arrondi(c1*e1+c2*e2) ;
  int erreur = arrondi(1000*double(exact-approx)/exact) ;
  if (erreur<0) { erreur = -erreur ; }
  std::cout
    <<std::right<<std::setw(2)<<bits<<" bits : "
    <<std::left<<exact<<" ~ "<<approx
    <<" ("<<erreur<<"/1000)"<<std::endl ;
 }
void teste_approxime( int bits, double valeur )
 {
  Coef coef ;
  int erreur ;
  approxime(bits,valeur,coef) ;
  double approximation = double(coef.numerateur_)/fois_puissance_de_deux(1,coef.exposant_) ;
  erreur = arrondi(100*(valeur-approximation)/valeur) ;
  if (erreur<0) { erreur = -erreur ; }
  std::cout
    <<std::right<<std::setw(2)<<bits<<" bits : "
    <<std::left<<valeur<<" ~ "<<std::setw(8)<<arrondi(approximation,6)
    <<" ("<<erreur<<"/100)"
    <<" ("<<coef.numerateur_<<"/2^"<<coef.exposant_<<")"
    <<std::endl ;
 }
Example #6
0
static int32_t orientation(double mx1, double my1, double mx2, double my2, double mxy2, int32_t n)
{
  double Mx2, My2, Mxy2, delta;
  double lambda1;
  double x, y, a;
  int32_t sign, theta;

  /* moments centres d'ordre 2 (variances et covariances) */
  Mx2 = mx2 - mx1 * mx1 / n;  
  My2 = my2 - my1 * my1 / n;  
  Mxy2 = mxy2 - mx1 * my1 / n;

  /* calcul des valeurs propres de la matrice des covariances */
  delta = (Mx2 - My2) * (Mx2 - My2) + 4 * Mxy2 * Mxy2;
  lambda1 = (Mx2 + My2 + sqrt(delta)) / 2.0;
#ifdef DEBUGORIEN
  printf("Mx2 = %g ; My2 = %g ; Mxy2 = %g ; lambda1 = %g\n", Mx2, My2, Mxy2, lambda1);
#endif
  if (mcabs(lambda1 - Mx2) < EPSILON) return 0; 
  a = Mxy2 / (lambda1 - Mx2);
  if (a < 0) sign = -1; else sign = 1; 
  a = a * a;
  x = sqrt(a / (1 + a));
  y = sign * sqrt(1 / (1 + a));
#ifdef DEBUGORIEN
  printf("x = %g ; y = %g ; atan2(y,x) = %g\n", x, y, atan2(y,x));
#endif
  theta = arrondi( (atan2(y,x) / M_PI) * 180.0 );
  if (theta < 0) return theta + 180; else return theta;
} /* orientation() */
 void teste( int bits, double valeur )
  {
   Coef c(bits) ;
   c = valeur ;
   erreur(bits,valeur,arrondi(c,6)) ;
   std::cout<<" ("<<c<<")"<<std::endl ;
  }
 void teste( int bits, double valeur )
  {
   Coef c(bits) ;
   c.approxime(valeur) ;
   erreur(bits,valeur,arrondi(c.approximation(),6)) ;
   std::cout<<" ("<<c.numerateur()<<"/2^"<<c.exposant()<<")"<<std::endl ;
  }
 void operator=( double valeur )
   {
    numerateur_ = exposant_ = 0 ;
    if (valeur==0) { return ; }
    double min = (entier_max(bits_)+0.5)/2 ;
    while (valeur<min)
     { exposant_ += 1 ; valeur *= 2 ; }
    numerateur_ = arrondi(valeur) ;
   }   
 void teste( int bits, double valeur )
  {
   Coef c(bits) ;
   c.approxime(valeur) ;
   erreur(bits,valeur,arrondi(c.approximation(),6)) ;
   std::cout<<" (" ;
   affiche(c) ;
   std::cout<<")"<<std::endl ;
  }
 void teste( int bits, double c1, int e1, double c2, int e2 )
  {
   int exact = arrondi(c1*e1+c2*e2) ;
   Coef coef1(bits), coef2(bits) ;
   coef1.approxime(c1) ;
   coef2.approxime(c2) ;
   int approx = coef1.multiplie(e1) + coef2.multiplie(e2) ;
   erreur(bits,exact,approx) ;
   std::cout<<std::endl ;
  }
 void teste( int bits, double c1, int e1, double c2, int e2 )
  {
   int exact = arrondi(c1*e1+c2*e2) ;
   Coef coef1(bits), coef2(bits) ;
   coef1 = c1 ;
   coef2 = c2 ;
   int approx = coef1*e1 + coef2*e2 ;
   erreur(bits,exact,approx) ;
   std::cout<<std::endl ;
  }
 void teste( double c1, int e1, double c2, int e2 )
  {
   c1_.approxime(c1) ;
   c2_.approxime(c2) ;
   int exact, approx ;
   exact = arrondi(c1*e1+c2*e2) ;
   approx = c1_.multiplie(e1) + c2_.multiplie(e2) ;
   erreur(c1_.lit_bits(),exact,approx) ;
   std::cout<<std::endl ;
  }
 void erreur( int bits, double exact, double approx )
  {
   if (exact==0) { echec(1,"division par 0") ; }
   int erreur = arrondi(resolution_*(exact-approx)/exact) ;
   if (erreur<0) { erreur = -erreur ; }
   std::cout
     <<std::right<<std::setw(2)<<bits<<" bits : "
     <<std::left<<exact<<" ~ "<<approx
     <<" ("<<erreur<<"/"<<resolution_<<")" ;
  } 
 virtual void execute( int bits )
  {
   Coef<U> c(bits) ;
   for ( int i=0 ; i<nb_ ; ++i )
    {
     c = num_[i] ;
     exact_[i] = num_[i] ;
     approx_[i] = arrondi(c,6) ;
    }
   erreur(bits) ;
  }
 virtual void execute( int bits )
  {
   Coef<U> coef1(bits), coef2(bits) ;
   for ( int i=0 ; i<nb_ ; ++i )
    {
     coef1 = num_[i] ; coef2 = (1-num_[i]) ;
     exact_[i] = 200. ;
     approx_[i] = arrondi(coef1*U(exact_[i]) + coef2*U(exact_[i]),3) ;
    }
   erreur(bits) ;
  }
void approxime( int bits, double valeur, Coef & coef )
 {
  coef.numerateur_ = coef.exposant_ = 0 ;
  if (valeur==0) { return ; }
  double min = (entier_max(bits)+0.5)/2 ;
  while (valeur<min)
   {
    coef.exposant_ = coef.exposant_ + 1 ;
    valeur = valeur * 2 ;
   }
  coef.numerateur_ = arrondi(valeur) ;
 }
void approxime( int bits, double valeur, int & numerateur, int & exposant )
 {
  numerateur = exposant = 0 ;
  if (valeur==0) { return ; }
  double min = (entier_max(bits)+0.5)/2 ;
  while (valeur<min)
   {
    exposant = exposant + 1 ;
    valeur = valeur * 2 ;
   }
  numerateur = arrondi(valeur) ;
 }
 // transformation d'un double en Coef
 void approxime( double valeur )
  {
   numerateur_ = exposant_ = 0 ;
   if (valeur==0) { return ; }
   double min = (entier_max(bits_)+0.5)/2 ;
   while (valeur<min)
    {
     exposant_ = exposant_ + 1 ;
     valeur = valeur * 2 ;
    }
   numerateur_ = arrondi(valeur) ;
  }
void teste_approxime( int bits, double valeur )
 {
  int numerateur, exposant, erreur ;
  approxime(bits,valeur,numerateur,exposant) ;
  double approximation = double(numerateur)/fois_puissance_de_deux(1,exposant) ;
  erreur = arrondi(100*(valeur-approximation)/valeur) ;
  if (erreur<0) { erreur = -erreur ; }
  std::cout
    << bits << " bits : " << valeur << " ~ "
    << std::setw(8) << approximation
    <<" ("<<erreur<<"/100)"
    <<" ("<<numerateur<<"/2^"<<exposant<<")"
    <<std::endl ;
 }
 void erreur( int bits )
  {
   double exacts {}, approxs {}, erreurs {} ;
   for ( int i=0 ; i<nb_ ; ++i )
    {
     exacts += exact_[i] ; approxs += approx_[i] ;
     erreurs += fabs(exact_[i]-approx_[i])/exact_[i] ;
    }
   exacts /= nb_ ; approxs /= nb_ ; erreurs /= nb_ ;
   erreurs *= resolution_ ;
   std::cout
     <<bits<<" bits : "
     <<std::left<<exacts<<" ~ "<<std::setw(width_)<<approxs
     <<" ("<<arrondi(erreurs)<<"/"<<resolution_<<")"
     <<std::endl ;
  }
int main()
 {
  int bits ;

  std::cout<<std::endl ;
  for ( bits = 2 ; bits <= 8 ; bits = bits + 2 )
   { teste_approxime(bits,0.65) ; }

  std::cout<<std::endl ;
  for ( bits = 2 ; bits <= 8 ; bits = bits + 2 )
   { teste_approxime(bits,0.35) ; }

  std::cout<<std::endl ;
  for ( bits = 1 ; bits <= 8 ; bits = bits + 1 )
   {
    int exact = arrondi(0.65*3515+0.35*4832) ;
    int approx = multiplie(bits,0.65,3515) + multiplie(bits,0.35,4832) ;
    std::cout << bits << " bits : 0.65*3515+0.35*4832 = " << exact << " ~ " << approx << std::endl ;
   }

  std::cout<<std::endl ;
  return 0 ;
 }
Example #23
0
int main(int argc, char** argv)
{
    Reel tableau_notes[NMAX];
    chaine tableau_noms[NMAX] = {"Christian", "Clement", "Gauthier", "Julien", "Lois", "Mathias", "Maximilien", "Messen", "Romain", "Samuel", "Xavier", "Yohan","Fabio","Jean","Luc"};
    int choix_eleve,i,choix_menu,choix_arrondi,ecart[NMAX],ecartmin,nom_proche;
    double note_eleve = 0.00;
    double somme_notes = 0.00;
    double moyenne_notes = 0.00;
    double ecart_type = 0.00;
    double somme_diff_carrees = 0.00;
    char nom_eleve[NMAX];


    srand(time(NULL));

    //Initialisation tableau de notes
    for(i=0;i<NMAX;i++)
    {
        tableau_notes[i] = (rand()/(double)RAND_MAX) * (20-0) + 0;//Aléatoire compris entre 0 et 20
    }

    //Menu
    printf("Nom prog : Gestions d'etudiants\n\n");

    printf("Menu :\n\n");
    printf("1-Afficher les noms et les notes\n");
    printf("2-Modifier la note d'un eleve\n");
    printf("3-Modifier le nom d'un eleve\n");
    printf("4-Afficher la moyenne et l'ecart-type de la classe\n");
    printf("5-Afficher les notes arrondies\n");
    printf("6-Algo Wagner-Fischer\n");
    printf("0-Quitter l'application\n");

    scanf("%d",&choix_menu);

    //Traitement menu
    while(choix_menu >= 1 && choix_menu <= 6)
    {
        switch(choix_menu)
        {
            case 1 :
                //Affichage noms + notes

                for(i=0;i<NMAX;i++)
                {
                    printf("%d - Nom : %s Note : %lf \n",i,tableau_noms[i],tableau_notes[i]);
                }

                do
                {
                    printf("Menu :\n\n");
                    printf("1-Afficher les noms et les notes\n");
                    printf("2-Modifier la note d'un eleve\n");
                    printf("3-Modifier le nom d'un eleve\n");
                    printf("4-Afficher la moyenne et l'ecart-type de la classe\n");
                    printf("5-Afficher les notes arrondies\n");
                    printf("6-Algo Wagner-Fischer\n");
                    printf("0-Quitter l'application\n");

                    scanf("%d",&choix_menu);
                }while(choix_menu < 0 || choix_menu > 6);
                break;

            case 2 :
                //Modification note
                do
                {
                    for(i=0;i<NMAX;i++)
                    {
                        printf("%d - Nom : %s \n",i,tableau_noms[i]);
                    }
                    printf("Veuillez entrer le numero de l'eleve choisi\n");
                    scanf("%d",&choix_eleve);
                }while(choix_eleve < 0 || choix_eleve > 14);


                do
                {
                    printf("Veuillez entrer la note de l'eleve %d :\n",choix_eleve);
                    scanf("%lf",&note_eleve);
                }while(note_eleve < 0 || note_eleve > 20);
                tableau_notes[choix_eleve] = note_eleve;


                do
                {
                    printf("Menu :\n\n");
                    printf("1-Afficher les noms et les notes\n");
                    printf("2-Modifier la note d'un eleve\n");
                    printf("3-Modifier le nom d'un eleve\n");
                    printf("4-Afficher la moyenne et l'ecart-type de la classe\n");
                    printf("5-Afficher les notes arrondies\n");
                    printf("6-Algo Wagner-Fischer\n");
                    printf("0-Quitter l'application\n");

                    scanf("%d",&choix_menu);
                }while(choix_menu < 0 || choix_menu > 6);

                break;

            case 3 :
                //Modification nom
                do
                {
                    for(i=0;i<NMAX;i++)
                    {
                        printf("%d - Nom : %s \n",i,tableau_noms[i]);
                    }
                    printf("Veuillez entrer le numero de l'eleve choisi\n");
                    scanf("%d",&choix_eleve);
                }while(choix_eleve < 0 || choix_eleve > 14);

                printf("Veuillez entrer le nouveau nom de l'eleve %d\n",choix_eleve);
                scanf("%s",tableau_noms[choix_eleve]);

                do
                {
                    printf("Menu :\n\n");
                    printf("1-Afficher les noms et les notes\n");
                    printf("2-Modifier la note d'un eleve\n");
                    printf("3-Modifier le nom d'un eleve\n");
                    printf("4-Afficher la moyenne et l'ecart-type de la classe\n");
                    printf("5-Afficher les notes arrondies\n");
                    printf("6-Algo Wagner-Fischer\n");
                    printf("0-Quitter l'application\n");

                    scanf("%d",&choix_menu);
                }while(choix_menu < 0 || choix_menu > 6);

                break;

            case 4 :
                //Affichage moyenne + ecart-type

                //Moyenne
                for(i=0;i<NMAX;i++)
                {
                    somme_notes += tableau_notes[i];
                }
                moyenne_notes = somme_notes/NMAX;
                printf("Moyenne de la classe : %lf\n",moyenne_notes);

                //Ecart-type
                for(i=0;i<NMAX;i++)
                {
                    somme_diff_carrees  += ((tableau_notes[i] - moyenne_notes) * (tableau_notes[i] - moyenne_notes)); //Somme_diff : note - moyenne
                }
                ecart_type = sqrt((somme_diff_carrees/NMAX)); //Racine carré de la somme de diff_carre / NMAX
                printf("Ecart-type de la classe : %lf\n",ecart_type);

                //Menu
                do
                {
                    printf("Menu :\n\n");
                    printf("1-Afficher les noms et les notes\n");
                    printf("2-Modifier la note d'un eleve\n");
                    printf("3-Modifier le nom d'un eleve\n");
                    printf("4-Afficher la moyenne et l'ecart-type de la classe\n");
                    printf("5-Afficher les notes arrondies\n");
                    printf("6-Algo Wagner-Fischer\n");
                    printf("0-Quitter l'application\n");

                    scanf("%d",&choix_menu);
                }while(choix_menu < 0 || choix_menu > 6);

                break;

            case 5 :

                //Arrondis des notes
                do
                {
                    printf("Quel arrondi souhaitez-vous ?\n");
                    printf("1 - au point\n");
                    printf("2 - au demi-point\n");
                    printf("3 - au quart de point\n");
                    scanf("%d",&choix_arrondi);
                }while(choix_arrondi < 1 || choix_arrondi > 3);

                do
                {
                    for(i=0;i<NMAX;i++)
                    {
                        printf("%d - Nom : %s \n",i,tableau_noms[i]);
                    }
                    printf("Veuillez entrer le numero de l'eleve choisi\n");
                    scanf("%d",&choix_eleve);
                }while(choix_eleve < 0 || choix_eleve > 14);

                switch(choix_arrondi)
                {
                    case 1 :
                        //Arrondi à l'entier de tableau_notes[choix_eleve]
                        printf( "%d \n",(int)arrondi(tableau_notes[choix_eleve],1));
                        break;
                    case 2 :
                        //Arrondi au demi point de tableau_notes[choix_eleve]
                        printf( "%5.2lf \n",(double)arrondi((int)tableau_notes[choix_eleve],2));
                        break;
                    case 3 :
                        //Arrondi au quart de point de tableau_notes[choix_eleve]
                        printf( "%5.2lf \n",(double)arrondi((int)tableau_notes[choix_eleve],4));
                        break;
                }

                do
                {
                    printf("Menu :\n\n");
                    printf("1-Afficher les noms et les notes\n");
                    printf("2-Modifier la note d'un eleve\n");
                    printf("3-Modifier le nom d'un eleve\n");
                    printf("4-Afficher la moyenne et l'ecart-type de la classe\n");
                    printf("5-Afficher les notes arrondies\n");
                    printf("6-Algo Wagner-Fischer\n");
                    printf("0-Quitter l'application\n");

                    scanf("%d",&choix_menu);
                }while(choix_menu < 0 || choix_menu > 6);

                break;
            case 6 :

                for(i=0;i<NMAX;i++)
                {
                    printf("%d - Nom : %s \n",i,tableau_noms[i]);
                }

                printf("Veuillez taper un nom \n");
                scanf("%s",nom_eleve);

                for(i=0; i<NMAX; i++)
                {
                    int a, b ,x;
                    int n = strlen(nom_eleve);
                    int m = strlen(tableau_noms[i]);
                    int m1, m2, m3, min;
                    int tableau[n+1][m+1];

                    tableau[0][0] = 0;

                    for(a=1;a<=n;a++)
                    {
                        tableau[a][0] =  tableau[a-1][0] + 1;
                    }
                    for(b=1; b<=m ;b++)
                    {
                        tableau[0][b] =  tableau[0][b-1] + 1;
                    }

                    for(a=1;a<=n;a++)
                    {
                        for(b=1;b<=m;b++)
                        {
                            if(nom_eleve[b-1] == tableau_noms[i][a-1])
                            {
                                x = 0;
                            }
                            else
                            {
                                x = 1;
                            }

                            m1 = tableau[a-1][b-1] + x;
                            m2 = tableau[a-1][b] + 1;
                            m3 = tableau[a][b-1] + 1;

                            min = m1;
                            if(m2 < m1)
                            {
                                min = m2;
                            }

                            if(m3 < min)
                            {
                                min = m3;
                            }

                            tableau[a][b] = min;
                        }
                    }
                    ecart[i] = tableau[n][m];
                }

                //Recherche du plus proche
                ecartmin = ecart[0];
                nom_proche = 0;
                for(i=1;i<NMAX;i++)
                {
                    if(ecart[i] < ecartmin)
                    {
                        ecartmin = ecart[i];
                        nom_proche = i;
                    }
                }

                //Affichage
                printf("Le nom le plus proche de %s est : %s \n",nom_eleve,tableau_noms[nom_proche]);

                 do
                {
                    printf("Menu :\n\n");
                    printf("1-Afficher les noms et les notes\n");
                    printf("2-Modifier la note d'un eleve\n");
                    printf("3-Modifier le nom d'un eleve\n");
                    printf("4-Afficher la moyenne et l'ecart-type de la classe\n");
                    printf("5-Afficher les notes arrondies\n");
                    printf("6-Algo Wagner-Fischer\n");
                    printf("0-Quitter l'application\n");

                    scanf("%d",&choix_menu);
                }while(choix_menu < 0 || choix_menu > 6);

                break;
        }
    }
    return 0;
}
Example #24
0
/* ==================================== */
int32_t lbarycentre(struct xvimage * image1, int32_t connex)
/* ==================================== */
{
  int32_t i, j;
  uint8_t *F;
  int32_t rs, cs, N;
  struct xvimage *label;
  int32_t *LABEL;     /* pour les labels des composantes connexes */
  int32_t nblabels;
  double *bxx;             /* pour les tables de barycentres par composantes */
  double *byy;
  int32_t *surf;
  int32_t lab;

  if (depth(image1) != 1) 
  {
    fprintf(stderr, "lbarycentre: cette version ne traite pas les images volumiques\n");
    return 0;
  }

  if ((connex != 4) && (connex != 8))
  {
    fprintf(stderr, "lbarycentre: mauvaise connexite (%d)\n", connex);
    return 0;
  }

  rs = image1->row_size;
  cs = image1->col_size;
  N = rs * cs;
  F = UCHARDATA(image1);

  label = allocimage(NULL, rs, cs, 1, VFF_TYP_4_BYTE);
  LABEL = SLONGDATA(label);

  if (! llabelextrema(image1, connex, LABMAX, label, &nblabels))
  {
    fprintf(stderr, "lbarycentre: llabelextrema failed\n");
    return 0;
  }

  bxx = (double *)calloc(1,nblabels * sizeof(double));
  byy = (double *)calloc(1,nblabels * sizeof(double));
  surf = (int32_t *)calloc(1,nblabels * sizeof(int32_t));
  if ((bxx == NULL) || (byy == NULL) || (surf == NULL))
  {
    fprintf(stderr, "lbarycentre: malloc failed\n");
    return 0;
  }

  /* ---------------------------------------------------------- */
  /* calcul des isobarycentres par composante */
  /* ---------------------------------------------------------- */
  
  for (i = 0; i < nblabels; i++)
  {
    bxx[i] = 0.0;
    byy[i] = 0.0;
    surf[i] = 0;
  }

  for (j = 0; j < cs; j++)
    for (i = 0; i < rs; i++)
    {
      lab = LABEL[j * rs + i] - 1; /* les valeurs des labels sont entre 1 et nblabels */
      if (F[j * rs + i] != 0)
      {
        surf[lab] += 1;
        bxx[lab] += (double)i;
        byy[lab] += (double)j;
      }
      else 
        surf[lab] = -1;          /* marque la composante "fond" */
    }

#ifdef DEBUG
printf("%d\n", nblabels-1);
#endif

  for (i = 0; i < nblabels-1; i++)
    if (surf[i] != -1)
    {
      bxx[i] = bxx[i] / surf[i];
      byy[i] = byy[i] / surf[i];

#ifdef DEBUG
printf("%g %g\n", bxx[i], byy[i]);
#endif

    }

  /* ---------------------------------------------------------- */
  /* marque l'emplacement approximatif des barycentres dans l'image */
  /* ---------------------------------------------------------- */

  for (j = 0; j < N; j++) F[j] = 0;

  for (i = 0; i < nblabels-1; i++)
    if (surf[i] != -1)
    {
      F[(int32_t)(arrondi(byy[i])) * rs + arrondi(bxx[i])] = NDG_MAX;
    }
  
  freeimage(label);
  /*  
  free(bxx);
  free(byy);
  free(surf);
  */
  return 1;
} /* lbarycentre() */
Example #25
0
/* ==================================== */
int32_t lbarycentrelab(struct xvimage * imagelab)
/* ==================================== */
{
  int32_t i, j;
  int32_t *F;
  int32_t rs, cs, N;
  int32_t nblabels;
  double *bxx;             /* pour les tables de barycentres par composantes */
  double *byy;
  int32_t *surf;
  int32_t lab;

  if (depth(imagelab) != 1) 
  {
    fprintf(stderr, "lbarycentre: cette version ne traite pas les images volumiques\n");
    return 0;
  }

  if (datatype(imagelab) != VFF_TYP_4_BYTE) 
  {
    fprintf(stderr, "lbarycentrelab: l'image doit etre de type int32_t\n");
    return 0;
  }

  rs = imagelab->row_size;
  cs = imagelab->col_size;
  N = rs * cs;
  F = SLONGDATA(imagelab);

  nblabels = 0;
  for (j = 0; j < N; j++) if (F[j] > nblabels ) nblabels = F[j];

  bxx = (double *)calloc(1,nblabels * sizeof(double));
  byy = (double *)calloc(1,nblabels * sizeof(double));
  surf = (int32_t *)calloc(1,nblabels * sizeof(int32_t));
  if ((bxx == NULL) || (byy == NULL) || (surf == NULL))
  {
    fprintf(stderr, "lbarycentre: malloc failed\n");
    return 0;
  }

  /* ---------------------------------------------------------- */
  /* calcul des isobarycentres par region (sauf fond) */
  /* ---------------------------------------------------------- */
  
  for (i = 0; i < nblabels; i++)
  {
    bxx[i] = 0.0;
    byy[i] = 0.0;
    surf[i] = 0;
  }

  for (j = 0; j < cs; j++)
    for (i = 0; i < rs; i++)
    {
      if (F[j * rs + i] != 0)
      {
        lab = F[j * rs + i] - 1; /* les valeurs des labels sont entre 1 et nblabels */
        surf[lab] += 1;
        bxx[lab] += (double)i;
        byy[lab] += (double)j;
      }
    }

#ifdef DEBUG
printf("%d\n", nblabels);
#endif

  for (i = 0; i < nblabels; i++)
  {
    bxx[i] = bxx[i] / surf[i];
    byy[i] = byy[i] / surf[i];

#ifdef DEBUG
printf("%g %g\n", bxx[i], byy[i]);
#endif

  }

  /* ---------------------------------------------------------- */
  /* marque l'emplacement approximatif des barycentres dans l'image */
  /* ---------------------------------------------------------- */

  for (j = 0; j < N; j++) F[j] = 0;

  for (i = 0; i < nblabels; i++)
    F[(int32_t)(arrondi(byy[i])) * rs + arrondi(bxx[i])] = NDG_MAX;
  
  free(bxx);
  free(byy);
  free(surf);
  return 1;
} /* lbarycentrelab() */