# -*- coding: utf-8 -*-
# Chapitre 10 — Marche des rayons dans une lunette afocale (CORRIGÉ)
# Un point objet à l'infini, vu sous l'angle alpha, envoie un faisceau
# de rayons parallèles sur l'objectif. On trace leur marche jusqu'à
# la sortie de l'oculaire (petits angles : les rayons sont des droites,
# la déviation se calcule avec les foyers).

import matplotlib.pyplot as plt

f1 = 50.0     # distance focale de l'objectif (cm)
f2 = 10.0     # distance focale de l'oculaire (cm)
alpha = 0.010  # angle d'incidence (rad), environ 0,6 degré

L = f1 + f2                 # lunette afocale : longueur (cm)
y1 = -f1 * alpha            # hauteur de l'image intermédiaire  # À COMPLÉTER
alpha_prime = alpha * f1 / f2   # angle émergent  # À COMPLÉTER

print("Image intermédiaire à", f1, "cm, hauteur :", y1, "cm")
print("alpha' =", alpha_prime, "rad ; G =", alpha_prime / alpha)

# trace de trois rayons entrant aux hauteurs h = +4, 0, -4 cm
for h in [4.0, 0.0, -4.0]:
    xs = [-20.0, 0.0, f1, L, L + 15.0]
    pente_sortie = -y1 / f2      # tous les émergents sont parallèles
    ys = [h + 20.0 * alpha,      # avant l'objectif
          h,                     # sur l'objectif
          y1,                    # au plan focal commun
          y1 + f2 * (y1 - h) / f1,   # sur l'oculaire
          y1 + f2 * (y1 - h) / f1 + 15.0 * pente_sortie]
    plt.plot(xs, ys, color="teal")

plt.axvline(0, color="k")
plt.axvline(L, color="k")
plt.axhline(0, color="gray", linestyle="--", linewidth=0.8)
plt.plot([f1], [y1], "ko")
plt.xlabel("position sur l'axe (cm)")
plt.ylabel("hauteur (cm)")
plt.title("Lunette afocale")
plt.grid(True)
plt.show()
