#include #include typedef struct Position { float x; float y; float z; float w; } Position ; typedef struct Direction { float x; float y; float z; float w; } Direction ; typedef struct Couleur { float r; float v; float b; float a; } Couleur ; typedef struct Energie { float er; float ev; float eb; } Energie ; typedef struct LumierePonctuelle { Position p; Couleur c; float e; } LumierePonctuelle ; typedef struct Material { Couleur kd; } Material ; float distanceAuCarre(Position *p1,Position *p2) { return((float) (pow(p1->x-p2->x,2.0)+ pow(p1->y-p2->y,2.0)+ pow(p1->z-p2->z,2.0))); } void energieRecue(Position *p,LumierePonctuelle *lp,Energie *e) { float d2 = distanceAuCarre(p,&lp->p); float f = lp->e/d2; e->er = f*lp->c.r; e->ev = f*lp->c.v; e->eb = f*lp->c.b; } void calculVecteurNorme(Position *p1,Position *p2,Direction *d) { d->x = p2->x-p1->x; d->y = p2->y-p1->y; d->z = p2->z-p1->z; float dist =(float) sqrt(distanceAuCarre(p1,p2)); if ( dist != 0 ) { d->x /= dist; d->y /= dist; d->z /= dist; } } float produitScalaire(Direction *d1,Direction *d2) { return(d1->x*d2->x+d1->y*d2->y+d1->z*d2->z); } void energieDiffusee(Position *p,Direction *n,Material *m,LumierePonctuelle *lp,Energie *e) { Direction i; calculVecteurNorme(p,&lp->p,&i); float ps = produitScalaire(n,&i); if ( ps <= 0 ) { e->er = e->ev = e->eb = 0.0F; } else { energieRecue(p,lp,e); e->er *= m->kd.r * ps; e->ev *= m->kd.v * ps; e->eb *= m->kd.b * ps; } } int main(void) { LumierePonctuelle lp1 = { { 1.0F,1.0F,3.0F,1.0F }, { 0.9F,0.6F,0.3F,1.0F }, 2.5F }; Position p1 = { -0.5F,0.5F,-1.0F,1.0F }; Direction n1 = { 0.0F,0.0F,1.0F,0.0F }; Material m1 = { { 0.2F,0.9F,0.9F,1.0F } }; Energie e; energieRecue(&p1,&lp1,&e); printf("Energie recue : %f %f %f\n",e.er,e.ev,e.eb); energieDiffusee(&p1,&n1,&m1,&lp1,&e); printf("Energie diffusee : %f %f %f\n",e.er,e.ev,e.eb); return(0); }