<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Photographie
TODO
* ...
Step1:  Constantes
Sources
Step2:  Angle de champ
$$\text{angle} = 2 \arctan \left( \frac{\frac{D}{2}}{f} \right) = 2 \arctan \left( \frac{D}{2f} \right)$$
avec $D$ la dimension (horizontale, verticale ou diagonale) du capteur et $f$ la focale de l'objectif.
Sources
<ASSISTANT_TASK:>
Python Code:
%matplotlib inline
import math
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets
from ipywidgets import interact
Explanation: Photographie
TODO
* ...
End of explanation
CAPTEUR_DICT = {"APS-C Canon (15x23 mm)": (14.9, 22.3),
                "Full frame (24x36 mm)": (24, 36)}
Explanation: Constantes
Sources:
* Obtenez le maximum du Canon EOS 80D, Vincent Burgeon, ed. Dunod, p.14
End of explanation
def angle(focale, capteur):
    angle = 2. * math.atan(float(capteur)/(2. * focale))
    return angle
@interact(focale=(8, 300, 1), capteur=CAPTEUR_DICT)
def square(focale, capteur):
    print("Capteur: {}x{} mm".format(capteur[0], capteur[1]))
    print("Focale: {} mm".format(focale))
    angle_verticale = round(math.degrees(angle(focale, capteur[0])), 1)
    angle_horizontale = round(math.degrees(angle(focale, capteur[1])), 1)
    print("Angle horizontale: {}°".format(angle_horizontale))
    print("Angle verticale: {}°".format(angle_verticale))
Explanation: Angle de champ
$$\text{angle} = 2 \arctan \left( \frac{\frac{D}{2}}{f} \right) = 2 \arctan \left( \frac{D}{2f} \right)$$
avec $D$ la dimension (horizontale, verticale ou diagonale) du capteur et $f$ la focale de l'objectif.
Sources:
* Tous photographes !, Jacques Croizer, ed. Dunod, p.247
End of explanation
<END_TASK>