/*************************************************************************************************************************************/ /* */ /* A R R A N G E M E N T H A R M O N I E U X D E P O I N T S S U R L A S P H E R E : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Les programmes 'v $xtc/PtsSphere.01$c' */ /* et 'v $xtc/PtsSphere.02$c' ne donnent */ /* exactement les memes resultats que s'ils */ /* sont compiles avec l'option '-ffloat-store'. */ /* */ /* */ /* Author of '$xtc/PtsSphere.01$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20080306150811). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" extern double drand48(); extern double srand48(); #define NOMBRE_DE_POINTS \ 26 #define NOMBRE_D_ITERATIONS \ 1000000000 #define RAYON_DE_LA_SPHERE_UNITE \ 1.0 /* Definition de la sphere unite. */ #define PONDERATION_0 \ 0.010 #define PONDERATION_N \ (1.0*(1/(double)NOMBRE_D_ITERATIONS)) /* Definition de l'interpolation... */ #define RANDOM(inf,sup) \ ((((sup)-(inf))*drand48())+(inf)) #define DISTANCE_1(dx,dy,dz) \ sqrt(EXP2(dx)+EXP2(dy)+EXP2(dz)) #define DISTANCE_2(dx,dy,dz) \ sqrt(EXP2(dx)+EXP2(dy)+EXP2(dz)) /* Le 20080310105944, fut introduit 'DISTANCE_2(...)' afin de reduire les temps de */ /* calcul. Ainsi pour 1000000 : */ /* */ /* DISTANCE_2(dx,dy,dz)=sqrt(EXP2(dx)+EXP2(dy)+EXP2(dz)) : 24 secondes */ /* */ /* alors que : */ /* */ /* DISTANCE_2(dx,dy,dz)= (EXP2(dx)+EXP2(dy)+EXP2(dz)) : 13 secondes */ /* */ /* ce qui n'est pas negligeable... */ typedef struct { double x,y,z; } points; void normalisation(point) points *point; { double module=DISTANCE_1(point->x,point->y,point->z); point->x = RAYON_DE_LA_SPHERE_UNITE*((point->x)/module); point->y = RAYON_DE_LA_SPHERE_UNITE*((point->y)/module); point->z = RAYON_DE_LA_SPHERE_UNITE*((point->z)/module); } main() { int compatibilite_20080319100633=0; int chercher_la_distance_minimale=VRAI; int modifier_le_point_i_de_la_distance_minimale=VRAI; int modifier_le_point_j_de_la_distance_minimale=VRAI; int chercher_la_distance_maximale=VRAI; int modifier_le_point_i_de_la_distance_maximale=VRAI; int modifier_le_point_j_de_la_distance_maximale=VRAI; /* Indicateurs de controle divers... */ int n,p; /* Index divers... */ points ListePoints[NOMBRE_DE_POINTS]; if (compatibilite_20080319100633 == 1) { } else { long int graine=1; /* Il semblerait qu'utiliser une graine nulle soit une mauvaise idee comme cela se voit */ /* avec N=19... */ srand48(graine); /* Introduit le 20080319100633 car, en effet, manquait... */ } for (p=0 ; p<NOMBRE_DE_POINTS ; p++) { ListePoints[p].x = RANDOM(-RAYON_DE_LA_SPHERE_UNITE,+RAYON_DE_LA_SPHERE_UNITE); ListePoints[p].y = RANDOM(-RAYON_DE_LA_SPHERE_UNITE,+RAYON_DE_LA_SPHERE_UNITE); ListePoints[p].z = RANDOM(-RAYON_DE_LA_SPHERE_UNITE,+RAYON_DE_LA_SPHERE_UNITE); /* Initialisation aleatoire du nuage de points a l'interieur du cube dans lequel la sphere */ /* unite est inscrite. */ normalisation(&ListePoints[p]); /* Mise du nuage de points sur la surface de la sphere unite. */ } for (n=1 ; n<=NOMBRE_D_ITERATIONS ; n++) { int i,j; int distance_minimale_trouvee=FAUX; double distance_minimale=+1000; int min_i,min_j; points point_min_i,point_min_j; int distance_maximale_trouvee=FAUX; double distance_maximale=-1000; int max_i,max_j; points point_max_i,point_max_j; double ponderation=((double)((PONDERATION_0*(NOMBRE_D_ITERATIONS-n))+(PONDERATION_N*(n-1)))) /((double)(NOMBRE_D_ITERATIONS-1) ); for (i=0 ; i<NOMBRE_DE_POINTS ; i++) { for (j=i+1 ; j<NOMBRE_DE_POINTS ; j++) { double distance=DISTANCE_2(ListePoints[i].x-ListePoints[j].x ,ListePoints[i].y-ListePoints[j].y ,ListePoints[i].z-ListePoints[j].z ); if (chercher_la_distance_minimale == VRAI) { if (distance < distance_minimale) { distance_minimale = distance; min_i = i; min_j = j; distance_minimale_trouvee = VRAI; /* Recherche de la distance minimale. */ } else { } } else { } if (chercher_la_distance_maximale == VRAI) { if (distance > distance_maximale) { distance_maximale = distance; max_i = i; max_j = j; distance_maximale_trouvee = VRAI; /* Recherche de la distance maximale. */ } else { } } else { } } } if (distance_minimale_trouvee == VRAI) { point_min_i = ListePoints[min_i]; point_min_j = ListePoints[min_j]; if (modifier_le_point_j_de_la_distance_minimale == VRAI) { ListePoints[min_j].x = point_min_j.x + ponderation*(point_min_j.x - point_min_i.x); ListePoints[min_j].y = point_min_j.y + ponderation*(point_min_j.y - point_min_i.y); ListePoints[min_j].z = point_min_j.z + ponderation*(point_min_j.z - point_min_i.z); normalisation(&ListePoints[min_j]); /* Augmentation de la distance minimale. */ } else { } if (modifier_le_point_i_de_la_distance_minimale == VRAI) { ListePoints[min_i].x = point_min_i.x - ponderation*(point_min_j.x - point_min_i.x); ListePoints[min_i].y = point_min_i.y - ponderation*(point_min_j.y - point_min_i.y); ListePoints[min_i].z = point_min_i.z - ponderation*(point_min_j.z - point_min_i.z); normalisation(&ListePoints[min_i]); /* Augmentation de la distance minimale. */ } else { } } else { } if (distance_maximale_trouvee == VRAI) { point_max_i = ListePoints[max_i]; point_max_j = ListePoints[max_j]; /* La logique voudrait que ci-apres, on trouve dans cet ordre : */ /* */ /* -ponderation */ /* */ /* et : */ /* */ /* +ponderation */ /* */ /* relativement a 'distance_maximale' qu'on voudrait reduire, mais, malheureusement */ /* et paradoxalement, cela ne marche pas et les "conventions inverses" ameliorent les */ /* choses... */ if (modifier_le_point_j_de_la_distance_maximale == VRAI) { ListePoints[max_j].x = point_max_j.x + ponderation*(point_max_j.x - point_max_i.x); ListePoints[max_j].y = point_max_j.y + ponderation*(point_max_j.y - point_max_i.y); ListePoints[max_j].z = point_max_j.z + ponderation*(point_max_j.z - point_max_i.z); normalisation(&ListePoints[max_j]); /* Augmentation (et non pas diminution !) de la distance maximale. */ } else { } if (modifier_le_point_i_de_la_distance_maximale == VRAI) { ListePoints[max_i].x = point_max_i.x - ponderation*(point_max_j.x - point_max_i.x); ListePoints[max_i].y = point_max_i.y - ponderation*(point_max_j.y - point_max_i.y); ListePoints[max_i].z = point_max_i.z - ponderation*(point_max_j.z - point_max_i.z); normalisation(&ListePoints[max_i]); /* Augmentation (et non pas diminution !) de la distance maximale. */ } else { } } else { } } for (p=0 ; p<NOMBRE_DE_POINTS ; p++) { printf("%+.16f %+.16f %+.16f\n",ListePoints[p].x,ListePoints[p].y,ListePoints[p].z); /* Edition des coordonees {X,Y,Z} resultantes... */ /* */ /* Le 20080308164838, ce calcul pour 1000000000 iterations a donne les coordonnees */ /* suivantes : */ /* */ /* */ /* :Debut_listG_xtc__PtsSphere_01_c__N26_1000000000: */ /* */ /* +0.6305995759857794 +0.7612158737281595 -0.1513095117658836 */ /* +0.6872243508285435 +0.5233576170172600 +0.5038050181749899 */ /* +0.0663339047941786 +0.5644271420439312 +0.8228133533182824 */ /* -0.4401094654292918 +0.8770237941320074 -0.1926990476516202 */ /* -0.1454391861891323 -0.9504674648302709 +0.2746980914017435 */ /* +0.3236762144259212 -0.0745037791392779 +0.9432300329765114 */ /* -0.5266340307455665 +0.7023961354074492 +0.4788488974878800 */ /* -0.6108779135070878 -0.5319401333885846 +0.5864024806221082 */ /* -0.4894122869432521 -0.8119509560966254 -0.3181371689739376 */ /* -0.4975035448912076 +0.4486796861732084 -0.7424127975972622 */ /* -0.0552295897164148 -0.5782849329451138 -0.8139632846439829 */ /* +0.9806296031475081 +0.1568290207158665 -0.1173466645970945 */ /* +0.0945946705961166 +0.9637468827727044 +0.2494870622711876 */ /* +0.8546037055073468 -0.1555181012905902 +0.4954458867566486 */ /* +0.6342115268020814 +0.3279584450972228 -0.7001564093549274 */ /* +0.6036644978481940 -0.3706060077699987 -0.7058614318989751 */ /* -0.9132055053515924 +0.3621415047233783 -0.1868401336764406 */ /* -0.3680457263863010 +0.0269256991543836 +0.9294177478474508 */ /* +0.0466866986161308 +0.0894225712289771 -0.9948989676982910 */ /* -0.6552981848549828 -0.2321302134298757 -0.7188183727053483 */ /* +0.4080042645623137 -0.6818589074902772 +0.6071251521516227 */ /* +0.8222505950105948 -0.5647236958045546 -0.0706477628914571 */ /* +0.1061672212167088 +0.7789406404900755 -0.6180453055658893 */ /* +0.2621252495809254 -0.9195870149641978 -0.2926603414222259 */ /* -0.8818170993623027 +0.1003355224113081 +0.4607942992428452 */ /* -0.9400712552955893 -0.3295209242444865 -0.0876469933998557 */ /* */ /* :Fin_listG_xtc__PtsSphere_01_c__N26_1000000000: */ /* */ /* */ /* et les distances aux trois plus proches voisins suivantes : */ /* */ /* d(00,12)=+0.69925529099624 d(00,14)=+0.69925529146779 d(00,01)=+0.69925529154322 */ /* d(01,00)=+0.69925529154322 d(01,13)=+0.69925529269271 d(01,02)=+0.69925529655024 */ /* d(02,17)=+0.69925529102451 d(02,12)=+0.69925529116713 d(02,06)=+0.69925529142275 */ /* d(03,16)=+0.69925529087008 d(03,09)=+0.69925529104870 d(03,06)=+0.69925529116044 */ /* d(04,20)=+0.69925529027298 d(04,07)=+0.69925529122796 d(04,23)=+0.69925529156737 */ /* d(05,17)=+0.69925529078330 d(05,13)=+0.69925529156775 d(05,20)=+0.69925529164131 */ /* d(06,03)=+0.69925529116044 d(06,24)=+0.69925529134293 d(06,02)=+0.69925529142275 */ /* d(07,04)=+0.69925529122796 d(07,24)=+0.69925529141972 d(07,17)=+0.69925529203252 */ /* d(08,10)=+0.69925529095393 d(08,25)=+0.69925529131028 d(08,04)=+0.69925529184902 */ /* d(09,16)=+0.69925529077393 d(09,18)=+0.69925529090520 d(09,03)=+0.69925529104870 */ /* d(10,08)=+0.69925529095393 d(10,18)=+0.69925529126365 d(10,19)=+0.69925529170830 */ /* d(11,14)=+0.69925529107233 d(11,13)=+0.69925529136100 d(11,00)=+0.69925529171881 */ /* d(12,00)=+0.69925529099624 d(12,02)=+0.69925529116713 d(12,03)=+0.69925529171736 */ /* d(13,11)=+0.69925529136100 d(13,21)=+0.69925529137237 d(13,05)=+0.69925529156775 */ /* d(14,11)=+0.69925529107233 d(14,18)=+0.69925529140351 d(14,22)=+0.69925529142649 */ /* d(15,14)=+0.69925529177105 d(15,21)=+0.69925529241799 d(15,10)=+0.69925529326305 */ /* d(16,09)=+0.69925529077393 d(16,03)=+0.69925529087008 d(16,24)=+0.69925529179808 */ /* d(17,05)=+0.69925529078330 d(17,02)=+0.69925529102451 d(17,24)=+0.69925529130807 */ /* d(18,09)=+0.69925529090520 d(18,10)=+0.69925529126365 d(18,14)=+0.69925529140351 */ /* d(19,25)=+0.69925529118881 d(19,10)=+0.69925529170830 d(19,09)=+0.69925529292587 */ /* d(20,04)=+0.69925529027298 d(20,05)=+0.69925529164131 d(20,13)=+0.69925529189454 */ /* d(21,13)=+0.69925529137237 d(21,23)=+0.69925529165219 d(21,15)=+0.69925529241799 */ /* d(22,03)=+0.69925529138002 d(22,14)=+0.69925529142649 d(22,09)=+0.69925529306097 */ /* d(23,04)=+0.69925529156737 d(23,21)=+0.69925529165219 d(23,10)=+0.69925529231295 */ /* d(24,17)=+0.69925529130807 d(24,06)=+0.69925529134293 d(24,07)=+0.69925529141972 */ /* d(25,19)=+0.69925529118881 d(25,08)=+0.69925529131028 d(25,24)=+0.69925529164293 */ /* */ } }