POINT* distanceInf(POINT xm, POINT *a, POINT *b){ double normeA,normeB; normeA=sqrt(auCarre((xm.x)-(a->x))+auCarre((xm.y)-(a->y))); normeB=sqrt(auCarre((xm.x)-(b->x))+auCarre((xm.y)-(b->y))); if(normeA>=normeB) return b; else return a; }
/* Dans cette fonction on tri le tableau de points donné: on enlève les redondances au niveau des équations */ int triAbscisse(POINT tab[],int longueur){ int i,j,k,compteur,doublon,c; POINT *resultat=malloc(longueur*sizeof(POINT)); compteur=0; doublon=0; for(i=0;i<longueur;i+=2){//on prend les points 2 par 2 if(tab[i].x==tab[i+1].x){//si ils ont la même abscisse if(auCarre(tab[i].y)<=auCarre(tab[i+1].y)){ resultat[compteur]= tab[i+1]; i-=1; compteur+=1; //on supprime le plus proche de (x,0) } else{ resultat[compteur]=tab[i]; compteur+=1; } doublon+=1; }else{ resultat[compteur]=tab[i]; resultat[compteur+1]=tab[i+1]; compteur+=2; } //printf("%d doublon\n",doublon); } POINT *resultat_without_zero=malloc((longueur-doublon)*sizeof(POINT)); c=0; for (j = 0; j < longueur; j++){ if((resultat[j].x==resultat[j+1].x)&&(resultat[j].y==resultat[j+1].y)){ j+=1; } resultat_without_zero[c]=resultat[j]; c+=1; } for(k=0;k<longueur-doublon;k++){ tab[k]=resultat_without_zero[k]; } return longueur-doublon; }
DOUBLET* tableauValeurCritique(POINT tab[],int longueur,int ordonne){ int i,j; double valeur_en_zero,valeur; double epsilon=0.00000001; double coeff_directeur; j=0; //if(longueur%2==0){ DOUBLET *critique=malloc((longueur/2)*sizeof(DOUBLET)); for(i=0;i<longueur;i+=2){ valeur_en_zero=(auCarre(tab[i+1].x)-auCarre(tab[i].x)+auCarre(tab[i+1].y)-auCarre(tab[i].y))/(epsilon+2*((tab[i+1].x)-(tab[i].x))); coeff_directeur=(((tab[i+1].y)-(tab[i].y))/((tab[i].x)-(tab[i+1].x))); valeur=valeur_en_zero+ (coeff_directeur*ordonne); critique[j].mediatrice=valeur; critique[j].a=tab[i]; critique[j].b=tab[i+1]; j+=1; } return critique; }
/* Calcul la distance entre 2 points */ double distance(POINT a , POINT b){ double norme; norme=sqrt(auCarre((a.x)-(b.x))+auCarre((a.y)-(b.y))); return norme; }