### Stigmatisme d'une lentille demi-boule 

## Importations 
import numpy as np
import matplotlib.pyplot as plt

## Constantes du problème
n = 1.5 # indice du milieu de la lentille
R = 5 # rayon en cm de la lentille

## Fonctions utiles
# Pour l'angle d'incidence angleI (noté i dans l'étude théorique) en fonction de yI
def angleI ( yI ) :
    return 
# Pour l'angle de réfraction angleR (noté r dans l'étude théorique) en fonction de yI
ylim = R/n
def angleR ( yI ) :
    if abs ( yI ) :
        return None
    else:
        return 
# Pour l'angle de déviation angleD (noté D dans l'étude théorique)
def angleD ( yI ) :
    if abs ( yI ) :
        return None
    else:
        return 
# Pour l'abscisse du point I
def xI (yI) :
    return 

## Tracés graphiques
# Tracé du dioptre d'entrée : segment compris entre le point (0, -R) et le point (0, R).
plt.plot ( [0,0] , [-R, R] , 'k-') 

# Tracé du dioptre de sortie
yS = np.linspace (-R, R, 500)
plt.plot ( xI(yS) , yS , 'k-') 

# Tracé des rayons
N = 10 # (2N+1) rayons tracés
for yI in [k*R/N for k in range(-N, N+1)]:
    plt.plot ( [-1, xI(yI)] , [yI, yI] , 'b-') # rayons incidents sur le dioptre sphérique
    if abs (yI) < ylim:
        y2 = yI + np.tan (angleD (yI) ) * (20 - xI (yI) ) # rayons émergents du dioptre sphérique
        plt.plot ([xI(yI), 20], [yI, y2], 'b-')
plt.xlabel ("x (cm)")
plt.ylabel ("y (cm)")
plt.title ("Tracé des rayons lumineux pour une lentille demi-boule")
plt.axis ('scaled') # pour avoir un repère orthonormé
plt.show ()