home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 14
/
CD_ASCQ_14_0694.iso
/
maj
/
4334
/
ovoide.frl
< prev
next >
Wrap
Text File
|
1994-05-11
|
5KB
|
106 lines
0:
$ 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, on projette sur un ovoïde:
$
$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))) ) )
)
)
)
;