Auteur: Emmanuel Bigler
Date: 18-03-2005 10:49
J'ai fait une simulation de profondeur de champ par tracé des fonctions classiques, en utilisant gnuplot, traceur libre et gratuit pour toute plateforme.
Dans le cas particulier les optiques de 110 et de 480, jusqu'à un grandissement de l'ordre de 1:10 à 1:20 les profondeurs de champ totales sont quasi-identiques si on travaillle au même grandissement et au même nombre d'ouverture, mais au-delà de 1:50, le grand angle l'emporte en PdC parce qu'on se rapproche de l'hyperfocale (calcul fait à f/22)
Voici le code source du fichier gnuplot à charger pour tracer la démo.
Les dièses # sont des comentaires dans le code source pour expliquer ce qu'on fait. Mes commentaires s'appliquent à la ligne de commande qui suit le commentaire.
Veuillez conserver ces dièses SVP merci.
Ne pas couper / replier les lignes dans votre navigateur les lignes longues doivent aller jusqu'au bout sans être repliées. Coupez-collez en ASCII vers votre presse-papiers favori.
#---------------------couper ici et sauvegarder en pur texte sous un nom quelconque genre pdc.plt---------------------------
#
# gnuplot est un logiciel de tracé de courbes & surfaces libre & gratuit
# pour tout système d'exploitation à télécharger ici
# ftp://ftp.irisa.fr/pub/mirrors/gnuplot
# http://www.gnuplot.info
#
# remet toutes les options à leur valeur standard
reset
#
# pour les caractères accentués dans les titres
set encoding iso_8859_1
# définit un intervalle de départ suivant x ; ici on trace en fonction de l'inverse
# du grandissement entre 1 et 15
set xrange [ 1.00 : 20.0 ]
#
#
# définition ds fonctions
# hyperfocale en millimètres, focale en millimètres,
# c en millimères, n nombre d'ouverture sans dimension
h(f,c,n)=f*f/(n*c)
#
# distance "p" entre l'objet et le plan principal image
# en fonction de l'invers du grandissement un_sur_g
p(f,un_sur_g)=f*(1.+un_sur_g)
#
# distances proche "p1" et lointaine "m2" de netteté acceptable ;
# formule valables pour optiques quasi symétrique uniquement
# en millimètres
p1(p,f,c,n)=1/(1/p+(1/h(f,c,n))*(1-f/p))
p2(p,f,c,n)=1/(1/p-(1/h(f,c,n))*(1-f/p))
#
#
# profondeur de champ totale en millimètres
pdc(p,f,c,n)=p2(p,f,c,n)-p1(p,f,c,n)
#
# idem mais on ne la trace que pour des valeurs raisonnables, par trop grande et positives
# on fait un test et pour ne rien tracer on demande à gnuplot de tracer un truc impossible
# par exemple de tracer la valeur 1/0 ; dans ce cas gnuplot ne trace pas
# ci-dessous il y deux test imbriqué c'est un peeu dur à lire
# syntaxe : (montruc satisfait telle condition ? tracer montruc : sinon ne rien tracer du tout)
#
pdc2(p,f,c,n)=(abs(pdc(p,f,c,n))<100000? ( pdc(p,f,c,n)>=0?pdc(p,f,c,n):1/0 ) :1/0)
#
# idem mais valeur de sortie exprimée en mètres
# lorsque la distance p_m est exprimée en mètres.
pdc2_m(p_m,f,c,n)=(.001*(abs(pdc(p_m*1000.,f,c,n))<100000? ( pdc(p_m*1000.,f,c,n)>=0?pdc(p_m*1000.,f,c,n):1/0 ) :1/0))
#
#idem mais valeur de sortie en mètres en fonction du grandissement sans dimension
# f,c son en millimètres.
pdc2_gm(un_sur_g,f,c,n)=.001*(abs(pdc(p(f,un_sur_g),f,c,n))<100000? ( pdc(p(f,un_sur_g) ,f,c,n)>=0?pdc(p(f,un_sur_g),f,c,n):1/0 ) :1/0)
#
#
#
# définition des valeurs courantes pour démarrer,
# après tracé on réaffecte de nouvelle valeurs à volonté et on fait 'replot'
# un dixième pour c c'est laxiste en 9x12 mais très strict en 20x25
#
c = 0.1
#
# diaph de travail le même dans les deux cas
# nombre d'ouverture sans dimension
n = 22
#
# définition des focales en millimètres
f1=110.
f2=480.
#
#
# affichage des fonctions et des valeurs des variables en cours
sho func
sho var
# affichage des hyperfocales classiques
pr "Hyperfocale(f1=",f1,"mm)=", int(.1*h(f1,c,n)+.5)*.01, " m ; Hyperfocale(f2=",f2,"mm)=", int(.1*h(f2,c,n)+.5)*.01," m"
#
#
# Enfin, tracé des deux courbes donannt la profondeur de champ totale en mètres
# en fonction du grandissement pour les deux focales f1 et f2.
#
# Titres et textes sur les axes
set title "Comparaison de profondeur de champ pour deux focales différentes f1 et f2\nlorsque le nombre d'ouverture et le grandissement sont les mêmes"
set xlabel "Inverse du grandissement : soit objet/image"
set ylabel "Profondeur de champ totale (p2 - p1) exprimée en mètres"
#
# Enfin on trace
plot pdc2_gm(x,f1,c,n),pdc2_gm(x,f2,c,n)
#----------FIN DE FICHIER-----------------------
|
|