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
| /***************************************************************************/
/****** GENERATEUR DE LA FONCTION ******/
/****** D'UNE PARTICULE DIFFUSEE ******/
/****** nom du programme : partdif ******/
/****** utilisation du programme : gener [intensity] **/
/***************************************************************************/
#include<stdio.h>
#include<math.h>
#include<string.h>
#include "image.h" /**** declaration de la structure image ****/
#define pi 3.1415927
char prg_name[255]; /*** nom du programme (ici partdif) ***/
double (*fct)(); /*** pointeur sur la fonction ***/
double intensity();
main(argc,argv) /**** programme principal avec arguments ****/
int argc; /*** argc : nombre de mots dans la commande */
char *argv[]; /**** argv[] : tableau de pointeurs sur des chaînes de caractères ****/
{
char nom_image[20];
FILE *df; /** nom de l'image **/
FILE *dat; /** nom du fichier contenant les données de la particule **/
int i,j,test,N;
double e;
struct image img; /**** img est une variable de type image ***/
uint8 *pixel;
float ZE,D,k,L,P;
/***********************************************************************/
if(argc<2){ fprintf(stderr,"Exemple d'utilisation du programme %s : partdif intensity| display -&\n",argv[0]);
exit(0);}
/**** si mauvaise utilisation de la commande ****/
strcpy(prg_name,argv[0]);
printf("\nNom du fichier image avec entête .pgm: ");
gets(nom_image);
/**************** Lecture des variables de la particule ***************/
dat=fopen("data.txt","r");
if(dat==0) printf("Erreur d'ouverture\n");
fscanf(dat,"%d\n%f\n%f\n%f\n%f\n%f",&N,&ZE,&D,&k,&L,&P);
fprintf(stderr,"N:%d\nZE:%5.2fmm\nD:%5.2fum\nk:%f\nL:%5.2fnm\nP:%5.2fum\n",N,1e3*ZE,1e6*D,k,1e9*L,1e6*P);
img.Xsize = N;
img.Ysize = N;
/********* creation fichier image *********************************************/
df=fopen(nom_image,"wb");
fprintf(stdout,"ecriture de l'entete .pgm\n");
fprintf(df, "P5\n%d %d\n255\n",img.Xsize,img.Ysize);
/******************** CHOIX DE LA FONCTION *******************************/
/****** fct prend l'adresse de la fonction désirée ***********/
if (!strcmp(argv[1],"intensity")) fct=&intensity;
else {fprintf(stderr,"\n\n\a %s :figure inexistante :\nintensity\n",argv[0]);exit(1);}
/******************* allocation memoire **********************************/
img.image = (uint8 *) malloc(img.Xsize*img.Ysize);
if ( img.image == NULL )
{
fprintf(stderr,"partdif: \n");
fprintf(stderr,"Pb d'allocation\n");
exit(3);
}
/************* CALCULS DES NIVEAUX DE GRIS DANS L'IMAGE ********/
fprintf(stderr,"%s: generation de l'image: *** %s ***\n",argv[0],argv[1]);
pixel = img.image;
for(j=0;j<img.Ysize;j++)
for(i=0;i<img.Xsize;i++)
{
e = (int)(128*(*fct)(N,i,j,D,ZE,k,L,P)); /** appel de la fonction (*fct) **/
*pixel++ = (uint8)e;
}
fprintf(stderr,"%s: image %s generee\n",argv[0],nom_image);
/*********** ECRITURE DE L'IMAGE e DANS UN FICHIER *******************/
test=fwrite((unsigned char*)img.image,img.Xsize,img.Ysize,df);
if (test!=img.Xsize) {fprintf(stdout,"probleme d'ecriture de l'image");scanf("%d",&test);}
fclose(df);
fclose(dat);
}
/**********************************************/
/* FIN DU PROGRAMME PRINCIPAL */
/**********************************************/
/****************** CALCUL DE LA FONCTION intensity ************/
double intensity(n,u,v,d,ze,K,l,p,z,U,V,phase,Z)
int n,u,v;
float d,ze,K,l,p;
double U, V;
double Z;
{
double r,F,NG,zeq,deq,alpha; /** p = taille du pixel **/
alpha = deq/(l*zeq); /*** cf App. OPtics, Vol.52(1), 2013 **/
zeq = K*ze;
deq = K*d;
u = u - n/2; /*** centrage figure en (N/2,N/2) ***/
v = v - n/2;
U = (rand() + 1.) / (RAND_MAX + 2.);
V = rand() / (RAND_MAX + 1.);
Z = sqrt(-2 * log(U)) * sin(2 * pi * V);
r = sqrt(u*u*p*p+v*v*p*p);
F = (pi/2)*alpha*alpha*j1(pi*r*alpha)/(pi*r*alpha);
NG = 1 - 2*l*zeq*sin((pi*r*r/(l*zeq)))*F + (l*zeq)*(l*zeq)*F*F + Z;
return(NG);
}
/******************* FIN ****************************************/ |
Partager