Hloubka ostrosti

Následující interaktivní notebook umožňuje názorně pochopit souvislost nastavení clony s hloubkou ostrosti při pořizování fotografií nebo natáčení filmového záznamu.
Notebook zobrazuje spojnou čočku, její optickou osu, stínítko, na kterém se má v ideálním případě zobrazit ostrý obraz předmětu, a clonu umístěnou před čočkou. Pomocí parametru clona ovlivňujeme velikost clony resp. velikost otvoru, kterým dopadá na čočku světlo. Parametr f značí ohnickovou vzdálenost dané čočky. Polohu obou předmětů (barevné kroužky), které se zobrazují čočkou, je možné určit přímo pomocí levého tlačítka myši.
Při vlastní práci s tímto notebookem lze volitelně zobrazit:
	čočku;
	stínítko;
	clonu;
	optickou osu;
	ohniska čočky;
	první předmět;
	druhý předmět;
	paprsky - lze zobrazit buď tři “význačné” paprsky, které se při grafickém hledání obrazu daného předmětu používají, nebo krajní paprsky vymezené clonou a nebo nezobrazovat žádné paprsky.

Tlačítkem Ulož obrázek se uloží právě zobrazené "bílé" okno do aktuální složky (složka, v níž je uložen tento notebook) pod jménem, které je uloženo v proměnné jmenosouboru. K tomuto jménu souboru je při opakovaném ukládání grafu přidáváno pořadové číslo.
Pozor! Při každém spuštění tohoto apletu se začínají soubory číslovat opět od jedné! Tak mohou být přepsány minule uložené obrázky.

© Jaroslav Reichl, 2011

Příprava pro vykreslení grafu

ClearAll["Global`*"];
jmenosouboru="hloubka_ostrosti_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

x1=-10;x2=-x1;
y1=-7.5;y2=-y1;
stredx=((x1+x2)/2);stredy=((y1+y2)/2);

clona0=1;clonamin=0.5;clonamax=1.4y2;deltaclona=0.05;
f0=0.25x2;fmin=0.1x2;fmax=0.75x2;deltaf=0.01x2;
a0=0.5x1;amin=0.8x1;amax=0.04x1;deltaa=0.01x2;
v0=0.25y2;vmin=0.9y1;vmax=0.9y2;deltav=0.01y2;

tloustka=0.004;
velikostbodu=0.02;

barva=Black;
barvaclony=Black;
barvaoptosy=Black;
barvastinitka=Gray;
barvaohnisko=Orange;
barvavzor=Blue;
barvaobraz=Lighter[barvavzor,0.4];
barvavzor2=Magenta;
barvaobraz2=Lighter[barvavzor2,0.4];
barvapaprsku=Darker[Brown];
barvapaprskuclony=Darker[Green];
barvapaprsku2=Darker[Yellow];
barvapaprskuclony2=Darker[Pink];
barvarozmazani=Red;
barvarozmazani2=Cyan;
barvavarovani=Red;

prvnibeh=True;
hornibodstinitka={0.75x2,y2};
dolnibodstinitka={0.75x2,y1};
stinitko=Line[{hornibodstinitka,dolnibodstinitka}];
optickaosa=Line[{{x1,stredy},{x2,stredy}}];
hornibodcocky={stredx,0.94y2};
dolnibodcocky={stredx,0.94y1};
cocka={
Line[{{0.05 x1,0.8y2},{stredx,0.95y2},{0.05 x2,0.8y2}}],
Line[{hornibodcocky,dolnibodcocky}],
Line[{{0.05 x1,0.8y1},{stredx,0.95y1},{0.05 x2,0.8y1}}]};

polohaclonyx=stredx-0.1x2;
polohaclonyy0=-(clonamax/2)-clonamin;

primka[bod1x_,bod1y_,bod2x_,bod2y_]:=(
rovniceprimky[x_]:=((bod2y-bod1y)/(bod2x-bod1x))x+qpom;
resenirceprimky=Solve[rovniceprimky[bod1x]==bod1y,qpom];
q=qpom/.resenirceprimky[[1]];
vyslednarce=rovniceprimky[x]/.qpom->q);
primkaobecna[bod1x_,bod1y_,bod2x_,bod2y_]:=(
If[bod1x≠bod2x,
{rceprimky[x_]:=((bod2y-bod1y)/(bod2x-bod1x))x+qpomocne,
reseni=Solve[rceprimky[bod1x]==bod1y,qpomocne],
q=qpomocne/.reseni[[1]],
obecnarce[x_,y_]:=-y+rceprimky[x]/.qpomocne->q},
obecnarce[x_,y_]:=x-bod1x];
obecnarce[x,y]);
prusecikprimek[bod1x_,bod1y_,bod2x_,bod2y_,bod3x_,bod3y_,bod4x_,bod4y_]:=(
rce1[x_,y_]:=primkaobecna[bod1x,bod1y,bod2x,bod2y];
rce2[x_,y_]:=primkaobecna[bod3x,bod3y,bod4x,bod4y];
reseniprusecik=Solve[{rce1[x,y]==0,rce2[x,y]==0},{x,y}];
pomx=x/.reseniprusecik[[1,1]];
pomy=y/.reseniprusecik[[1,2]];
prusecik={pomx,pomy});

HloubkaOstrosti=Manipulate[Deploy[
If[prvnibeh,
{vzory={{a0,v0},{a0,0}},
prvnibeh=False},
""];
avzor=vzory[[1,1]];
yvzor=vzory[[1,2]];
avzor2=vzory[[2,1]];
yvzor2=vzory[[2,2]];
If[avzor>stredx-f,
avzor=stredx-f,
""];
If[avzor2>stredx-f,
avzor2=stredx-f,
""];
polohaclonyy=polohaclonyy0+(cisloclona/2);
clona={
Line[{{polohaclonyx,polohaclonyy},{polohaclonyx,0.94y1}}],
Line[{{polohaclonyx,-polohaclonyy},{polohaclonyx,0.94y2}}]};
ohnisko={
Point[{stredx-f,stredy}],
Point[{stredx+f,stredy}]};
vzor=Point[{avzor,yvzor}];
vzor2=Point[{avzor2,yvzor2}];

reseni=Solve[(1/(-avzor))+(1/apom)==(1/f),apom];
If[reseni≠{},
{chyba=False,
aobraz=apom/.reseni[[1]],
yobraz=(aobraz/avzor)yvzor,
obraz=Point[{aobraz,yobraz}]},
chyba=True];
reseni2=Solve[(1/(-avzor2))+(1/apom2)==(1/f),apom2];
If[reseni2≠{},
{chyba2=False,
aobraz2=apom2/.reseni2[[1]],
yobraz2=(aobraz2/avzor2)yvzor2,
obraz2=Point[{aobraz2,yobraz2}]},
chyba2=True];
bodnacocce11=prusecikprimek[avzor,yvzor,polohaclonyx,polohaclonyy,hornibodcocky[[1]],hornibodcocky[[2]],
dolnibodcocky[[1]],dolnibodcocky[[2]]];
bodnacocce12=prusecikprimek[avzor,yvzor,polohaclonyx,-polohaclonyy,hornibodcocky[[1]],hornibodcocky[[2]],dolnibodcocky[[1]],dolnibodcocky[[2]]];
bodnacocce21=prusecikprimek[avzor2,yvzor2,polohaclonyx,polohaclonyy,hornibodcocky[[1]],hornibodcocky[[2]],dolnibodcocky[[1]],dolnibodcocky[[2]]];
bodnacocce22=prusecikprimek[avzor2,yvzor2,polohaclonyx,-polohaclonyy,hornibodcocky[[1]],hornibodcocky[[2]],dolnibodcocky[[1]],dolnibodcocky[[2]]];

bodnastinitku11=prusecikprimek[bodnacocce11[[1]],bodnacocce11[[2]],aobraz,yobraz,hornibodstinitka[[1]],
hornibodstinitka[[2]],dolnibodstinitka[[1]],dolnibodstinitka[[2]]];
bodnastinitku12=prusecikprimek[bodnacocce12[[1]],bodnacocce12[[2]],aobraz,yobraz,hornibodstinitka[[1]],
hornibodstinitka[[2]],dolnibodstinitka[[1]],dolnibodstinitka[[2]]];
bodnastinitku21=prusecikprimek[bodnacocce21[[1]],bodnacocce21[[2]],aobraz2,yobraz2,hornibodstinitka[[1]],
hornibodstinitka[[2]],dolnibodstinitka[[1]],dolnibodstinitka[[2]]];
bodnastinitku22=prusecikprimek[bodnacocce22[[1]],bodnacocce22[[2]],aobraz2,yobraz2,hornibodstinitka[[1]],
hornibodstinitka[[2]],dolnibodstinitka[[1]],dolnibodstinitka[[2]]];

rozmazanibodu=Line[{{bodnastinitku11[[1]],bodnastinitku11[[2]]},{bodnastinitku12[[1]],bodnastinitku12[[2]]}}];
rozmazanibodu2=Line[{{bodnastinitku21[[1]],bodnastinitku21[[2]]},{bodnastinitku22[[1]],bodnastinitku22[[2]]}}];

grafik=Show[
If[zobrazitvzor∧zobrazitpaprsky=="význačné",
{Plot[primka[avzor,yvzor,stredx,yvzor],{x,avzor,stredx},PlotStyle->{barvapaprsku,Thickness[0.75tloustka]}],
Plot[primka[stredx,yvzor,aobraz,yobraz],{x,stredx,aobraz},PlotStyle->{barvapaprsku,Thickness[0.75tloustka]}],
Plot[primka[avzor,yvzor,aobraz,yobraz],{x,avzor,aobraz},PlotStyle->{barvapaprsku,Thickness[0.75tloustka]}],
Plot[primka[avzor,yvzor,stredx,yobraz],{x,avzor,stredx},PlotStyle->{barvapaprsku,Thickness[0.75tloustka]}],
Plot[primka[stredx,yobraz,aobraz,yobraz],{x,stredx,aobraz},PlotStyle->{barvapaprsku,Thickness[0.75tloustka]}]},
If[zobrazitvzor∧zobrazitpaprsky=="clony",
{Plot[primka[avzor,yvzor,bodnacocce11[[1]],bodnacocce11[[2]]],{x,avzor,bodnacocce11[[1]]},PlotStyle->{barvapaprskuclony,Thickness[0.8tloustka]}],
Plot[primka[avzor,yvzor,bodnacocce12[[1]],bodnacocce12[[2]]],{x,avzor,bodnacocce12[[1]]},PlotStyle->{barvapaprskuclony,Thickness[0.8tloustka]}],
Plot[primka[bodnacocce11[[1]],bodnacocce11[[2]],bodnastinitku11[[1]],bodnastinitku11[[2]]],{x,bodnacocce11[[1]],Max[aobraz,bodnastinitku11[[1]]]},PlotStyle->{barvapaprskuclony,Thickness[0.8tloustka]}],
Plot[primka[bodnacocce12[[1]],bodnacocce12[[2]],bodnastinitku12[[1]],bodnastinitku12[[2]]],{x,bodnacocce12[[1]],Max[aobraz,bodnastinitku12[[1]]]},PlotStyle->{barvapaprskuclony,Thickness[0.8tloustka]}]},
Plot["",{x,0,0.01}]]],
If[zobrazitvzor2∧zobrazitpaprsky=="význačné",
{Plot[primka[avzor2,yvzor2,stredx,yvzor2],{x,avzor2,stredx},PlotStyle->{barvapaprsku2,Thickness[0.75tloustka]}],
Plot[primka[stredx,yvzor2,aobraz2,yobraz2],{x,stredx,aobraz2},PlotStyle->{barvapaprsku2,Thickness[0.75tloustka]}],
Plot[primka[avzor2,yvzor2,aobraz2,yobraz2],{x,avzor2,aobraz2},PlotStyle->{barvapaprsku2,Thickness[0.75tloustka]}],
Plot[primka[avzor2,yvzor2,stredx,yobraz2],{x,avzor2,stredx},PlotStyle->{barvapaprsku2,Thickness[0.75tloustka]}],
Plot[primka[stredx,yobraz2,aobraz2,yobraz2],{x,stredx,aobraz2},PlotStyle->{barvapaprsku2,Thickness[0.75tloustka]}]},
If[zobrazitvzor2∧zobrazitpaprsky=="clony",
{Plot[primka[avzor2,yvzor2,bodnacocce21[[1]],bodnacocce21[[2]]],{x,avzor2,bodnacocce21[[1]]},PlotStyle->{barvapaprskuclony2,Thickness[0.8tloustka]}],
Plot[primka[avzor2,yvzor2,bodnacocce22[[1]],bodnacocce22[[2]]],{x,avzor2,bodnacocce22[[1]]},PlotStyle->{barvapaprskuclony2,Thickness[0.8tloustka]}],
Plot[primka[bodnacocce21[[1]],bodnacocce21[[2]],bodnastinitku21[[1]],bodnastinitku21[[2]]],{x,bodnacocce21[[1]],Max[aobraz2,bodnastinitku21[[1]]]},PlotStyle->{barvapaprskuclony2,Thickness[0.8tloustka]}],
Plot[primka[bodnacocce22[[1]],bodnacocce22[[2]],bodnastinitku22[[1]],bodnastinitku22[[2]]],{x,bodnacocce22[[1]],Max[aobraz2,bodnastinitku22[[1]]]},PlotStyle->{barvapaprskuclony2,Thickness[0.8tloustka]}]},
Plot["",{x,0,0.01}]]],

Graphics[{
If[zobrazitoptosu,
{{barvaoptosy,Thickness[tloustka],Dotted,optickaosa},
Text[Style["o",15,barvaoptosy,FontFamily->Times],{0.95x1,0.01y1},{Center,Top}]},
Text[""]],
If[zobrazitcocku,
{barvaoptosy,Thickness[2tloustka],cocka},
Text[""]],
If[zobrazitclonu,
{barvaclony,Thickness[3tloustka],clona},
Text[""]],
If[zobrazitstinitko,
{barvastinitka,Thickness[3.25tloustka],stinitko},
Text[""]],
If[zobrazitohnisko,
{{barvaohnisko,PointSize[velikostbodu],ohnisko},
Text[Style["F",18,barvaohnisko,FontFamily->Times],{stredx-f,0.025y1},{Center,Top}],
Text[Style["F'",18,barvaohnisko,FontFamily->Times],{stredx+f,0.025y1},{Center,Top}]},
Text[""]],
If[zobrazitvzor,
{{barvavzor,PointSize[velikostbodu],vzor},
If[chyba==False,
{{barvaobraz,PointSize[velikostbodu],obraz},
If[zobrazitpaprsky=="clony",
{barvarozmazani,Thickness[2tloustka],rozmazanibodu},
Text[""]]},
Text[Style["Obraz 1. předmětu neexistuje!",20,barvavarovani,FontFamily->Times],{stredx,0.2y2},{Center,Center}]]},
Text[""]],
If[zobrazitvzor2,
{{barvavzor2,PointSize[velikostbodu],vzor2},
If[chyba2==False,
{{barvaobraz2,PointSize[velikostbodu],obraz2},
If[zobrazitpaprsky=="clony",
{barvarozmazani2,Thickness[2tloustka],rozmazanibodu2},
Text[""]]},
Text[Style["Obraz 2. předmětu neexistuje!",20,barvavarovani,FontFamily->Times],{stredx,0.2y2},{Center,Center}]]},
Text[""]]
}],
FormatType->StandardForm,Axes->False,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

{{vzory,{{0,0}}},Locator,Appearance->""},
{{cisloclona,clona0,Style["clona",15,barva]},clonamin,clonamax,deltaclona},
Delimiter,
{{f,f0,Style["f",15,barvaohnisko]},fmin,fmax,deltaf},
Delimiter,
Item[Style["Zobrazit",20,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitcocku,True,Style["- čočku",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitstinitko,True,Style["- stínítko",15,barvastinitka,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitclonu,True,Style["- clonu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitoptosu,True,Style["- optickou osu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitohnisko,True,Style["- ohniska",15,barvaohnisko,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvzor,True,Style["- 1. předmět",15,barvavzor,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvzor2,False,Style["- 2. předmět",15,barvavzor2,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitpaprsky,"clony",Style["- paprsky",15,barva,FontFamily->Times]},{"význačné","clony","žádné"},ControlType->RadioButton},
Delimiter,
Button[" Ulož obrázek ",{pocetulozeni=pocetulozeni+1,Export[StringInsert[StringJoin[cesta,jmenosouboru],ToString[pocetulozeni],-5],grafik]},ImageSize->{100,Automatic}],
ControlPlacement->Left,
FrameLabel->{Style["© Jaroslav Reichl, 2011",10,Black,FontFamily->Times],"",Style["Hloubka ostrosti",25,Black,FontFamily->Times],""}];

Spuštění animace
Zpracujte běžným způsobem následující buňku a na dotaz, který se objeví, odpovězte ANO.

HloubkaOstrosti