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-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 définition d'une sphère
5"""
6import math
7from .image_synthese_base import Objet
10class Sphere (Objet):
11 """définit une sphère"""
12 __slots__ = "centre", "rayon", "couleur"
14 def __init__(self, centre, rayon, couleur):
15 """initialisation"""
16 self.centre, self.rayon, self.couleur = centre, float(rayon), couleur
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
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
42 if lr is None:
43 return None
45 v = r.origine + r.direction * lr
46 return v
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
53 def couleur_point(self, p):
54 """retourne la couleur au point de coordonnée p"""
55 return self.couleur
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