Cône de rayons · tache de confusion · image enregistrée — distances en f′
Animation guidée (mode par défaut) : un scénario en 11 étapes, bouclable, qui déplace l'objet
tout seul et affiche les explications. Lecture / pause, étape précédente / suivante,
recommencer, vitesse de 0,75× à 2×, et clic direct sur une étape. Raccourcis :
Espace = pause, ← / → = changer d'étape.
La case « mes réglages » rejoue le même scénario avec les paramètres du mode libre (le texte de l'étape 6 s'adapte alors au cas hyperfocal). À la sortie du mode guidé, vos réglages sont restitués.
Réglages libres : quatre curseurs xA (objet), xA′ (capteur),
R (ouverture) et ε (demi-côté d'un pixel), quatre scénarios, et trois options
(zone de netteté, repères ±ε, photons). Le bandeau en haut indique en permanence si l'image est
nette ou floue, et pourquoi.
Boutons utiles : ◎ Netteté max amène l'objet à la position de conjugaison ;
⌖ Mise au point déplace le capteur pour rendre l'objet courant parfaitement net —
ce sont les deux façons de résoudre la même équation.
Pause et exploration : si vous déplacez un élément du schéma ou sélectionnez une mire pendant le scénario, la lecture se met en pause. À la reprise (bouton ou Espace), les paramètres de démonstration sont rétablis et le scénario repart à l’étape 1 : les anciennes trajectoires ne sont jamais utilisées avec de nouveaux réglages. Sans modification, la pause reprend au même endroit. La densité de la mire et la visibilité de la courbe ne provoquent pas cette réinitialisation.
La courbe de netteté est repliée par défaut : cliquez sur « Afficher » sous le cône ou sur « Courbe » en haut pour la déplier, puis sur « Masquer » pour la replier. Le scénario ne la déplie pas automatiquement. L’export PNG conserve les cinq graphiques, y compris la courbe masquée.
R et ε se déplacent à la souris.r/ε en fonction de la position de l'objet.
La bande verte est la zone où la tache tient dans un pixel ; le point orange suit l'objet.
Minimum de la courbe = conjugaison ; intersections avec le trait rouge = plans nets.Optique géométrique paraxiale, lentille mince convergente de distance focale
f′ = 1 placée en x = 0. Toutes les distances sont exprimées en f′,
les objets sont à gauche (x < 0) et le capteur à droite (xS = xA′ > 0).
Le rayon r se déduit de la hauteur des rayons extrêmes à la traversée du capteur :
un rayon passant par le bord de la lentille en y = ±R converge vers (xA′, 0),
donc il coupe le plan xS en y = ±R(1 − xS/xA′).
Un pixel a pour côté 2ε : ε est le rayon du cercle de confusion admissible, c'est-à-dire
le cercle inscrit dans le pixel central. Le seuil r = ε correspond donc au moment où
la tache commence à déborder sur les pixels voisins.
0,30 + 0,70 × fraction_couverte (échantillonnage 11 × 11 par pixel), puis on
divise par la somme des poids : la somme des énergies vaut toujours exactement 1.
Autrement dit l'image ne « gagne » pas de lumière en s'étalant, elle la répartit.drawPixels().r/(2ε) pixels : on accumule K copies
de la mire décalées dans ce disque, avec globalCompositeOperation = 'lighter'
et alpha = 1/K — l'alpha final est donc exactement la fraction de la tache
qui recouvre chaque pixel. L'image est ensuite agrandie sans interpolation :
on obtient de vrais pixels carrés. (Le filter: blur() natif a été écarté
car Chrome l'ignore pour un rayon inférieur à 1 px, ce qui masquait tout flou modéré.)
Les barres les plus fines, plus étroites qu'un pixel, disparaissent en premier.PIX = borné(5ε, 1,2, 4) / densité. Le curseur Densité · mire, accessible dans les deux modes, va de ×0,4 à ×2,5 (×0,7 par défaut ; ×1 correspond au réglage précédent). Plus la densité est grande, plus la mire occupe de pixels, sans modifier les paramètres optiques ni les grilles 5 × 5. Comme un pixel mesure physiquement
2ε, réduire ce coefficient augmente le nombre de pixels qui couvrent la
mire — autrement dit cela revient à agrandir physiquement la mire sur le capteur.
Avec ε = 0,30 on dispose d'environ 560 × 45 pixels : à la netteté maximale
les barres fines sont correctement échantillonnées et la mire paraît nette ; quand ε grandit,
les pixels grossissent et la mire devient plus grossière, ce qui est le comportement attendu.
Coût : quelques centaines de fillRect + 7 petits blits par image, sans
lecture de pixels — l'animation reste fluide (environ 60 images/s).m − ε/R ≤ 0, la courbe ne recoupe plus jamais le seuil
du côté lointain : la profondeur de champ est infinie, l'affichage montre ∞
et l'étape 6 du scénario change de texte.r_Airy ≈ 1,22 λ·f/# avec f/# = f′/(2R) s'ajouterait en quadrature :
r_tot = √(r_geo² + r_Airy²). On perdrait alors de la netteté en fermant trop le diaphragme —
effet absent ici. Le code contient un commentaire à l'endroit où l'ajouter.Au départ : xS = 2 f′, R = 2,40 f′, ε = 0,60 f′,
objet étudié à −2 f′ (cinquième mire), densité ×0,7.
Les plans nets sont à −1,60 f′ et −2,67 f′.
Les grandes excursions vont de −1,08 à −6,50 f′.
Après le bilan, quatre expériences font varier un paramètre à la fois : fermeture du diaphragme, réduction des pixels, déplacement de la mise au point et réglage hyperfocal. Chaque étape restaure sa base avant de calculer les valeurs animées : cliquer directement sur une étape ou boucler ne conserve pas les réglages de l’étape précédente.
À l’hyperfocale : xS = f′(1 + ε/R), distance objet de mise au point
H = f′(1 + R/ε), premier plan net à H/2, dernier plan net à l’infini.