Coverage for src/ensae_teaching_cs/special/image/image_synthese_phong.py: 84%
32 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
1# -*- coding: utf-8 -*-
2"""
3@file
4@brief implémentation du modèle d'illumination de Phong
5"""
6from .image_synthese_scene import Scene
7from .image_synthese_base import Couleur
10class ScenePhong (Scene):
11 """définit une scène et utilise le modèle d'illumination de Phong
12 pour construire l'image de synthèse"""
14 def __init__(self, repere, alpha, x, y,
15 ka=0.1,
16 kb=0.8,
17 kc=0.3,
18 reflet=6,
19 fond=Couleur(200, 200, 200)):
20 """définit la position de l'oeil, l'angle d'ouverture,
21 et la taille de l'écran"""
22 Scene.__init__(self, repere, alpha, x, y)
23 self.ka, self.kb, self.kc = ka, kb, kc
24 self.reflet = reflet
25 self.fond = fond
26 self.constante = float(1)
28 def __str__(self):
29 """affichage"""
30 s = Scene.__str__(self)
31 s += f"ka = {self.ka:1.3f} kb = {self.kb:1.3f} kc = {self.kc:1.3f}\n"
32 s += "reflet " + str(self.reflet) + "\n"
33 s += "couleur du fond " + str(self.fond) + "\n"
34 return s
36 def couleur_fond(self):
37 """retourne la couleur du fond"""
38 return self.fond * self.ka
40 def modele_illumination(self, rayon, p, obj, source):
41 """calcule la couleur pour un rayon donné, un point p, un objet obj,
42 et une source de lumière source"""
43 n = obj.normale(p, rayon).renorme()
44 vr = rayon.direction.renorme()
45 vr *= float(-1)
46 vs = source.origine - p
47 vs = vs.renorme()
48 bi = vs + vr
49 bi = bi.renorme()
51 # premier terme
52 cos = n.scalaire(vs)
53 couleur = source.couleur.produit_terme(
54 obj.couleur_point(p)) * (cos * self.kb)
56 # second terme : reflet
57 cos = n.scalaire(bi) ** self.reflet
58 couleur += source.couleur.produit_terme(
59 source.couleur) * (cos * self.kc)
60 couleur = couleur.produit_terme(rayon.couleur)
62 return couleur