Code source de ensae_teaching_cs.special.image.image_synthese_phong

# -*-  coding: utf-8 -*-
"""
implémentation du modèle d'illumination de Phong


:githublink:`%|py|6`
"""
from .image_synthese_scene import Scene
from .image_synthese_base import Couleur


[docs]class ScenePhong (Scene): """ définit une scène et utilise le modèle d'illumination de Phong pour construire l'image de synthèse :githublink:`%|py|12` """
[docs] def __init__(self, repere, alpha, x, y, ka=0.1, kb=0.8, kc=0.3, reflet=6, fond=Couleur(200, 200, 200)): """ définit la position de l'oeil, l'angle d'ouverture, et la taille de l'écran :githublink:`%|py|21` """ Scene.__init__(self, repere, alpha, x, y) self.ka, self.kb, self.kc = ka, kb, kc self.reflet = reflet self.fond = fond self.constante = float(1)
[docs] def __str__(self): """ affichage :githublink:`%|py|29` """ s = Scene.__str__(self) s += "ka = %1.3f kb = %1.3f kc = %1.3f\n" % ( self.ka, self.kb, self.kc) s += "reflet " + str(self.reflet) + "\n" s += "couleur du fond " + str(self.fond) + "\n" return s
[docs] def couleur_fond(self): """ retourne la couleur du fond :githublink:`%|py|38` """ return self.fond * self.ka
[docs] def modele_illumination(self, rayon, p, obj, source): """ calcule la couleur pour un rayon donné, un point p, un objet obj, et une source de lumière source :githublink:`%|py|43` """ n = obj.normale(p, rayon).renorme() vr = rayon.direction.renorme() vr *= float(-1) vs = source.origine - p vs = vs.renorme() bi = vs + vr bi = bi.renorme() # premier terme cos = n.scalaire(vs) couleur = source.couleur.produit_terme( obj.couleur_point(p)) * (cos * self.kb) # second terme : reflet cos = n.scalaire(bi) ** self.reflet couleur += source.couleur.produit_terme( source.couleur) * (cos * self.kc) couleur = couleur.produit_terme(rayon.couleur) return couleur