$ algo 0 0: $ initialisation (z=const): c; $ test de sortie, si >0 sort: x*x+y*y-nor*nor; $ récurrence (z=?): 1/(z*z+z0)+z0; $ $ $ $ $ algo 1 1: $ Projection sur une surface: $ J'explique ici comment transformer un algorithme pour que le nouvel algorithme $ donne comme image la projection sur une surface de l'image obtenue par $ l'ancien algorithme. $ Quel est le calcul effectué: $ On se place dans l'espace, l'image étant dans le plan nul en z. $ On se donne une fonction de D -> R où D inclu dans R² $ (x,y) -> f(x,y) $ et l'on suppose que la surface obtenue par cette fonction est un miroir. $ La transformation d'algorithme que je vais expliquer consiste à remplacer $ l'image sur le plan nul en z par son reflet. $ $ Partout dans les formules de l'algorithme, il faut remplacer z0 par $ $( $ max(((f'x(x0,y0))*(f'x(x0,y0))+(f'y(x0,y0))*(f'y(x0,y0))>=0.5),(1-(domaine(x0,y0))))* $ (spx+i*spy) $ + $ min(((f'x(x0,y0))*(f'x(x0,y0))+(f'y(x0,y0))*(f'y(x0,y0))<0.5),(domaine(x0,y0)))* $ ( $ z0+2*(f(x0,y0))*((f'x(x0,y0))+i*(f'y(x0,y0)))/ $ ( $ rz( 1-2*( (f'x(x0,y0))*(f'x(x0,y0))+(f'y(x0,y0))*(f'y(x0,y0)) ) ) $ ) $ ) $) $ $puis il faut remplacer: $ f(x0,y0) par sa valeur sachant que f(.,.) est la fonction donnant $ la surface. $ f'x(x0,y0) par sa valeur: c'est la dérivée partielle en x de f, appliquée $ au point (x0,y0). $ f'y(x0,y0) par sa valeur: c'est la dérivée partielle en y de f, appliquée $ au point (x0,y0). $ domaine(x0,y0) par une fonction qui vaut 1 si f est définie pour (x0,y0) $ et 0 si f n'est pas définie pour (x0,y0) $ spx et spy servent quand la lumière reflétée n'est pas un point du plan: $ ils déterminent alors la valeur de remplacement de z0. Si par $ exemple on veut que la couleur soit celle de fond on remplace spx par $ 10000 et spy par 10000 $ $ $Voici un exemple d'une telle transformation: l'algorithme de base est celle $de l'image de Mandelbrot: $ $c; $x*x+y*y-nor*nor; $z*z+ $z0 $; $ $ce qui donne pour le premier remplacement: $ $c; $x*x+y*y-nor*nor; $z*z+ $( $ max(((f'x(x0,y0))*(f'x(x0,y0))+(f'y(x0,y0))*(f'y(x0,y0))>=0.5), $ (1-(domaine(x0,y0))))*(spx+i*spy) $ + $ min(((f'x(x0,y0))*(f'x(x0,y0))+(f'y(x0,y0))*(f'y(x0,y0))<0.5),(domaine(x0,y0)))* $ ( $ z0+2*(f(x0,y0))*((f'x(x0,y0))+i*(f'y(x0,y0)))/ $ ( $ rz( 1-2*( (f'x(x0,y0))*(f'x(x0,y0))+(f'y(x0,y0))*(f'y(x0,y0)) ) ) $ ) $ ) $) $; $ $ on prend comme fonction celle qui donne un demi-ovoide de centre (v0,v1,v2) $ et de coef v4, v5, v6 et de rayon v3 tourné vers le plan $ $ on met des || pour ne pas provoquer d'erreur de calcul. $ $ f(x0,y0) = -v6*(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5)+v2 $ f'x(x0,y0) = v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)) $ f'y(x0,y0) = v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5)) $ domaine(x0,y0)=v4*v5*v6*(v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) ))>0 $ on prend spx=spy=10 $ $ $ $et on remplace: c; x*x+y*y-nor*nor; z*z+ ( max(((v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)))*(v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)))+(v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5)))*(v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5)))>=0.5),(1-(v4*v5*v6*(v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) ))>0)))* (100+i*100) + min(((v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)))*(v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)))+(v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5)))*(v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5)))<0.5),(v4*v5*v6*(v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) ))>0))* ( z0+2*(-v6*(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)+v2)*((v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)))+i*(v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5))))/ ( rz( 1-2*( (v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)))*(v6*((x0-v0)/v4)/(v4*rz(|v3*v3-(((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5))| puir 0.5)))+(v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5)))*(v6*((y0-v1)/v5)/(v5*rz(|v3*v3-( ((x0-v0)/v4)*((x0-v0)/v4)+((y0-v1)/v5)*((y0-v1)/v5) )| puir 0.5))) ) ) ) ) ) ;