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

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 

8 

9 

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""" 

13 

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) 

27 

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 

35 

36 def couleur_fond(self): 

37 """retourne la couleur du fond""" 

38 return self.fond * self.ka 

39 

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() 

50 

51 # premier terme 

52 cos = n.scalaire(vs) 

53 couleur = source.couleur.produit_terme( 

54 obj.couleur_point(p)) * (cos * self.kb) 

55 

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) 

61 

62 return couleur