Coverage for src/ensae_teaching_cs/special/image/image_synthese_sphere.py: 95%

40 statements  

« prev     ^ index     » next       coverage.py v7.1.0, created at 2023-01-27 05:44 +0100

1# -*- coding:utf-8 -*- 

2""" 

3@file 

4@brief définition d'une sphère 

5""" 

6import math 

7from .image_synthese_base import Objet 

8 

9 

10class Sphere (Objet): 

11 """définit une sphère""" 

12 __slots__ = "centre", "rayon", "couleur" 

13 

14 def __init__(self, centre, rayon, couleur): 

15 """initialisation""" 

16 self.centre, self.rayon, self.couleur = centre, float(rayon), couleur 

17 

18 def intersection(self, r): 

19 """retourne le point d'intersection avec le rayon r, 

20 retourne None s'il n'y pas d'intersection""" 

21 oc = self.centre - r.origine 

22 vn = r.direction.norme2() 

23 s = r.direction.scalaire(oc) 

24 delta = s * s - vn * (oc.norme2() - self.rayon * self.rayon) 

25 if delta < 0: 

26 return None 

27 delta = math.sqrt(delta) 

28 l1 = (s - delta) / vn 

29 l2 = (s + delta) / vn 

30 

31 if 0 < l1 < l2: 

32 lr = l1 

33 elif l1 < 0 < l2: 

34 lr = l2 

35 elif 0 < l2 < l1: 

36 lr = l2 

37 elif l2 < 0 < l1: 

38 lr = l1 

39 else: 

40 lr = None 

41 

42 if lr is None: 

43 return None 

44 

45 v = r.origine + r.direction * lr 

46 return v 

47 

48 def normale(self, p, rayon): 

49 """retourne la normale au point de coordonnée p""" 

50 v = (p - self.centre) / self.rayon 

51 return v 

52 

53 def couleur_point(self, p): 

54 """retourne la couleur au point de coordonnée p""" 

55 return self.couleur 

56 

57 def __str__(self): 

58 """affichage""" 

59 s = "sphere --- centre : " + str(self.centre) 

60 s += " rayon : " + str(self.rayon) 

61 s += " couleur : " + str(self.couleur) 

62 return s