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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| #include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MIN(a,b) (a)<(b)?(a):(b)
#define n
/*extern*/ float R =3; //portee radio d'un noeud
/*extern*/ int adj=2; //longueur maximale d'un noeud a son chef
/*extern*/ int nbVoisMaxi =100; //nombre maximum de voisin (peut poser probleme)
/*extern*/ int DEBUG =1;
/* Genere N point uniformement repartit dans une boule de rayon */
/* 2*R, et on rajoute un point 0 correspondant a Palm. */
/* Les points sont numerotes de 0 a N. */
void generePoints2R(int N, double* abscisses, double* ordonnees)
{
int i;
float theta,r;
abscisses[0]= 0.0;
ordonnees[0]= 0.0;
for (i=1; i<N; i++)
{
theta = 2 * 3.1415 * rand()/RAND_MAX;
r = 2 * R * sqrt(1.0 * rand()/RAND_MAX);
abscisses[i]= r * cos(theta);
ordonnees[i]= r * sin(theta);
}
}
void imprimePoints(int N, double* abscisses, double* ordonnees)
{
int i;
printf("Coordonnees des %d points\n",N);
for (i=0; i<N; i++)
{
printf("abscisses[%d]=%f ordonnees[%d]=%f\n",i,abscisses[i],i,ordonnees[i]);
}
}//fin de imprimePoints
/* construit le tableau de voisinage : ou la ligne i contient */
/* la liste des indices des voisins du point d'indice i. */
/* La diagonale vaut 0: un point n'est pas voisin avec lui-meme.*/
/* Construit egalement le tableau taille ou le ieme element */
/* contient le nombre de voisins du point d'indice i. */
/* Enfin, construit le graph sous forme matricielle */
/* Genere les degres des points a savoir */
/* deux tableaux contenant les indices des points du 1 voisinage et du 2 voisinages */
/* voisinage1 et voisinage2. */
/* Pour le 1 voisinage : un tableau couple a voisinage1 qui decrit d+(u) c'est a dire */
/* le nombre de 2 voisins (taille1). */
/* Pour le 2 voisinage : un tableau couple a voisinage2 qui decrit d-(u) c'est a dire */
/* le nombre de 1 voisins de chaque point (taille2) */
void genereVoisin(int N, double* abscisses, double* ordonnees, int* taille, int* taille1, int* taille2, int** voisinage, int** voisinage1, int** voisinage2, char** voisinageM)
{
int i,j,compt;
int vois1;//nb de voisins dans le 1 voisinage et le 2 voisinage
float ray=R*R;
float distance;//distance a l'origine
double tempa, tempo;
for(i=0;i<N;i++){
compt=0;
vois1=0;
tempa = abscisses[i];
tempo = ordonnees[i];
distance=abscisses[i]*abscisses[i]+ordonnees[i]*ordonnees[i];
for(j=0;j<i;j++){
if((abscisses[j]-tempa)*(abscisses[j]-tempa)+(ordonnees[j]-tempo)*(ordonnees[j]-tempo)<ray)
{
voisinage[i][compt]=j;
voisinageM[i][j]=1;
compt++;
if(compt>=nbVoisMaxi) fprintf(stderr,"nbVoisMaxi pas assez grand\n");
//si i est voisin de 0
if(distance<=ray){
//calcul pour i des voisins du 2 voisinages
if((abscisses[j]*abscisses[j]+ordonnees[j]*ordonnees[j])>ray){
// on compte et repertorie les voisins de i du 2 voisinages
voisinage1[i][vois1]=j;
vois1++;
// on compte et repertorie les voisins de j (j in N2) dans N1
voisinage2[j][taille2[j]]=i;
taille2[j]++;
}
}//fin du if(distance<=ray)
}//fin du if
}//fin du for sur j
for(j=i+1;j<N;j++){
if((abscisses[j]-tempa)*(abscisses[j]-tempa)+(ordonnees[j]-tempo)*(ordonnees[j]-tempo)<ray)
{
//i et j sont voisins
voisinage[i][compt]=j;
voisinageM[i][j]=1;
compt++;
if(compt>=nbVoisMaxi) fprintf(stderr,"nbVoisMaxi pas assez grand\n");
//si i est voisin de 0
if(distance<=ray){
//calcul pour i des voisins du 2 voisinages
if((abscisses[j]*abscisses[j]+ordonnees[j]*ordonnees[j])>ray){
// on compte et repertorie les voisins de i du 2 voisinages
voisinage1[i][vois1]=j;
vois1++;
// on compte et repertorie les voisins de j (j in N2) dans N1
voisinage2[j][taille2[j]]=i;
taille2[j]++;
}
}//fin du if(distance<=ray)
}//fin du if
}//fin du for sur j
taille[i]=compt;
taille1[i]=vois1;
}//fin du for sur i
}
int main()
{
int i;
double* a=(double*) calloc ( n , sizeof(double));
double* b=(double*) calloc ( n , sizeof(double));
int* taille=(int*) calloc ( n , sizeof(int));
int* taille1=(int*) calloc ( n , sizeof(int));
int* taille2=(int*) calloc ( n , sizeof(int));
int** voisn=(int**) calloc ( n*n, sizeof(int));
int** voisn1=(int**) calloc ( n*n, sizeof(int));
int** voisn2=(int**) calloc ( n*n, sizeof(int));
char** voisnM=(char**) calloc ( n*n, sizeof(char));
generePoints2R(n, a, b);
imprimePoints(n, a, b);
genereVoisin(n,a,b, taille, taille1,taille2, voisn , voisn1, voisn2, voisnM);
free(a);
free(b);
free(taille);
free(taille1);
free(taille2);
free(voisn);
free(voisn1);
free(voisn2);
free(voisn);
system("pause");
} |
Partager