####################################################################################################################################### # # # D I F F U S I O N T R I D I M E N S I O N N E L L E " D O U C E " # # ( C A L C U L D ' I S O S U R F A C E S D E L A D E N S I T E D E P A R T I C U L E S ) : # # # # # # Author of '$xiirk/.DIFZ.13.1.$U' : # # # # Jean-Francois Colonna (LACTAMME, 20070630131131). # # # ####################################################################################################################################### $Z setParam _____Pas 1 $Z # Introduit le 20070701103201... # $Z SETParam _____Binariser FAUX $Z # Introduit le 20070701100711 (d'ou la modification 'v $xiirk/.DIFZ.11.3.$U unset'...). # $Z setParam _____PaletteC $xiP/arc_ciel.01 $Z # Introduit le 20070701103746... # $c #include <stdio.h> $c #include <math.h> $c $c #define RAYONmin Bande0 $c #define RAYONmax Nbandes $c #define dRAYON -1 $c $c #define NIVEAU0 0 $c #define NIVEAUn 255 $c $c #define RAYON (RAYONmax-rayon+RAYONmin) $c $c int main() $c { $c double rayon; $c double seuil_inferieur=NIVEAU0,seuil_superieur; $c double facteur; $c $c int n=1; $c $c for (rayon=RAYONmax ; rayon>=RAYONmin ; rayon=rayon+dRAYON) $c { $c double dniveau=((-2*RAYON*exp(-(RAYON*RAYON)/(RAYONmax*RAYONmax)))*dRAYON); $c /* Les images '$_____imagesD' contiennent des exponentielles dont le niveau est donne */ $c /* par : */ $c /* */ $c /* 2 */ $c /* -rayon */ $c /* niveau = e */ $c /* */ $c /* 'D' designant une differentielle, on a donc : */ $c /* */ $c /* 2 */ $c /* -rayon */ $c /* Dniveau = -2.rayon.e .Drayon */ $c /* */ $c /* Ici, on calcule donc l'increment 'Dniveau' des niveaux pour un increment 'Drayon' */ $c /* constant et egal a 'dRAYON'. Ainsi, les iso-surfaces auront toutes "la meme epaisseur"... */ $c $c seuil_superieur=seuil_inferieur+dniveau; $c seuil_inferieur=seuil_inferieur+(dniveau/2); $c } $c $c facteur=(double)NIVEAUn/seuil_superieur; $c /* Facteur de renormalisation garantissant ("a epsilon pres") que 'seuil_inferieur' */ $c /* atteindra bien 'NIVEAUn' a la fin des iterations... */ $c $c seuil_inferieur=NIVEAU0; $c $c for (rayon=RAYONmax ; rayon>=RAYONmin ; rayon=rayon+dRAYON) $c { $c double dniveau=facteur*((-2*RAYON*exp(-(RAYON*RAYON)/(RAYONmax*RAYONmax)))*dRAYON); $c $c seuil_superieur=seuil_inferieur+dniveau; $c $c printf("echo %cimage=%04d : IsoSurface=%.2f%c\n" $c ,'"' $c ,n $c ,((seuil_inferieur+seuil_superieur)/2)*(1/(double)NIVEAUn) $c ,'"' $c ); $c /* Edition d'une aide au legendage des images (introduit le 20070701111757). */ $c $c printf("$xci/accumule.02$X $c A=$_____imagesD. $c premiere=$_____Premiere derniere=$_____Derniere pas=$_____Pas $c binariser=$_____Binariser $c passe_bande=VRAI $c seuil_inferieur=%d seuil_superieur=%d $c seuil=$NOIR_PLANCHER $c trx=0 try=0 $c R=$_____imagesISD.%04d $c $formatI\n" $c ,(int)seuil_inferieur,(int)seuil_superieur $c ,n $c ); $c /* Calcul des iso-surfaces... */ $c $c printf("$xci/vraies_C$X $c A=$_____imagesISD.%04d $c p=$_____PaletteC $c R=$xTV/COUCHE $c $formatI\n" $c ,n $c ); $c printf("execRVB $xci/pt_isole.01$X $c A=$xTV/COUCHE%cs $c points=9 $c seuil=0.05 $c R=$_____imagesISD.%04d%cs $c $formatI\n" $c ,'%' $c ,n $c ,'%' $c ); $c $c seuil_inferieur=seuil_inferieur+(dniveau/2); $c $c n++; $c } $c } $Z unset _____Pas $Z unset _____Binariser $Z # Introduit le 20070706094859 a cause de 'v $xiirk/.DIFZ.13.1.$U _____Pas' et de # $Z # 'v $xiirk/.DIFZ.13.1.$U _____Binariser'... #