Zákon odrazu a lomu

Následující aplet umožňuje názorně pochopit zákon odrazu a lomu světla na rozhraní dvou optických prostředí, která jsou charakterizovaná svými indexy lomu.
Ovládání apletu je intuitivní.

Tlačítkem Ulož obrázek se uloží právě zobrazené okno (okno s optickými prostředími) 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 může dojít k přepsání minule uložených obrázků.

© Jaroslav Reichl, 2008

Příprava pro vykreslení grafu

jmenosouboru="zakon_odrazu_lomu_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;


x1=-10;x2=-x1;
y1=-10;y2=-y1;
deltay=1;
stredx=((x1+x2)/2);stredy=((y1+y2)/2);
vzdalenost=(Sqrt[(x1^2)+(y1^2)]);
polomer=0.02vzdalenost;

alfa0=30;
n10=1.0;
n20=1.5;
nmin=1;nmax=2.5;deltan=0.01;

tloustka=0.005;

barva=Black;
barvaalfa=Lighter[Red,0.2];
barvan1=Yellow;
barvan2=Lighter[Orange,0.5];
barvadopad=Red;
barvaodraz=Blue;
barvalom=Brown;
barvavarovani=Magenta;
barvazdroje=Orange;

rozhrani=Line[{{x1,stredy},{x2,stredy}}];
kolmice=Line[{{stredx,y1},{stredx,y2}}];
prostredi1=Rectangle[{x1,stredy},{x2,y2}];
prostredi2=Rectangle[{x1,stredy},{x2,y1}];

ZakonOdrazLom=Manipulate[
snell=((Sin[alfa Degree])/(Sin[betapom Degree]))==(n2/n1);
reseni=Quiet[Solve[snell,betapom]];
If[reseni≠{},
{chyba=False,
beta=betapom/.reseni[[1]],
If[Im[beta]≠0,
chyba=True,
""]},
beta=0];

paprsekdopad={
Arrowheads[{0,7tloustka}],
Arrow[{{0.62vzdalenost Cos[(90+alfa) Degree],0.62vzdalenost Sin[(90+alfa) Degree]},{stredx,stredy}}]};
paprsekodraz={
Arrowheads[{-7tloustka,0}],
Arrow[{{0.7vzdalenost Cos[(90-alfa) Degree],0.7vzdalenost Sin[(90-alfa) Degree]},{stredx,stredy}}]};
paprseklom={
Arrowheads[{-7tloustka,0}],
Arrow[{{0.7vzdalenost Cos[(270+beta) Degree],0.7vzdalenost Sin[(270+beta) Degree]},{stredx,stredy}}]};
uheldopadu=Circle[{stredx,stredy},0.25vzdalenost,{90 Degree,(90+alfa)Degree}];
uhelodrazu=Circle[{stredx,stredy},0.25vzdalenost,{(90-alfa) Degree,90Degree}];
uhellomu=Circle[{stredx,stredy},0.25vzdalenost,{270 Degree,(270+beta)Degree}];
zdrojsvetla1=Disk[{0.68vzdalenost Cos[(90+alfa) Degree],0.68vzdalenost Sin[(90+alfa) Degree]},polomer];
zdrojsvetla2=Circle[{0.68vzdalenost Cos[(90+alfa) Degree],0.68vzdalenost Sin[(90+alfa) Degree]},polomer];
zdrojsvetla3=Table[Line[{{0.68vzdalenost Cos[(90+alfa) Degree]+1.6polomer Cos[i],0.68vzdalenost Sin[(90+alfa) Degree]+1.6polomer Sin[i]},{0.68vzdalenost Cos[(90+alfa) Degree]+2.8polomer Cos[i],0.68vzdalenost Sin[(90+alfa) Degree]+2.8polomer Sin[i]}}], {i, 0, 2 π, ((2 π)/12)}];

grafik=Deploy[Show[
Graphics[{
{Lighter[barvan1,(1.35-(n1/nmax))],prostredi1},
{Lighter[barvan1,(1.35-(n2/nmax))],prostredi2},
If[Abs[n1-n2]≠0,
{barva,Thickness[1.5Abs[n1-n2] tloustka],rozhrani},
{Lighter[barva,0.7],Dashed,Thickness[0.1 tloustka],rozhrani}],
{barva,Dashed,Thickness[0.2tloustka],kolmice},
If[zobrazitzdroj,
{{Lighter[barvazdroje,0.7],zdrojsvetla1},
{barvazdroje,Thickness[tloustka],zdrojsvetla2},
{barvazdroje,Thickness[tloustka],zdrojsvetla3}},
Text[""]],
Text[Style["k",20,barva,FontFamily->Times],{0.02x2,y2},{Left,Top}],
{barvadopad,Thickness[tloustka],paprsekdopad},
If[zobrazitodraz&&Abs[n1-n2]≠0,
{barvaodraz,Thickness[tloustka],paprsekodraz},
Text[""]],
If[zobrazitlom&&chyba==False,
{barvalom,Thickness[tloustka],paprseklom},
If[zobrazitlom&&chyba==True,
Text[Style["Lomený paprsek neexistuje - došlo k totálnímu odrazu!",20,barvavarovani,FontFamily->Times,Bold],{stredx,(y1/2)},{Center,Center}],
Text[""]]],
If[zobrazituhly,
{{barva,Dotted,Thickness[0.2tloustka],uheldopadu},
Text[Style["α",22,barvadopad,FontFamily->Times],{0.15vzdalenost Cos[(90+(alfa/2)) Degree],0.15vzdalenost Sin[(90+(alfa/2)) Degree]},{Center,Center}],
If[zobrazitodraz&&Abs[n1-n2]≠0,
{{barva,Dotted,Thickness[0.2tloustka],uhelodrazu},
Text[Style["α´",22,barvaodraz,FontFamily->Times],{0.15vzdalenost Cos[(90-(alfa/2)) Degree],0.15vzdalenost Sin[(90-(alfa/2)) Degree]},{Center,Center}]},
Text[""]],
If[zobrazitlom&&chyba==False,
{{barva,Dotted,Thickness[0.2tloustka],uhellomu},
Text[Style["β",22,barvalom,FontFamily->Times],{0.15vzdalenost Cos[(270+(beta/2)) Degree],0.15vzdalenost Sin[(270+(beta/2)) Degree]},{Center,Center}]},
Text[""]]},
Text[""]],
If[zobrazitrychlosti,
{Text[Style[StringJoin["(Subscript[v, 1]) = ",ToString[Round[(1/n1),0.01]]," c"],20,barva,FontFamily->Times],{x1,y2-deltay},{Left,Top}],
Text[Style[StringJoin["(Subscript[v, 2]) = ",ToString[Round[(1/n2),0.01]]," c"],20,barva,FontFamily->Times],{x1,y1},{Left,Bottom}]},
Text[""]],
If[zobrazithodnoty,
{Text[Style[StringJoin["1. prostředí: (Subscript[n, 1]) = ",ToString[n1]],20,barva,FontFamily->Times],{x1,y2},{Left,Top}],
Text[Style[StringJoin["2. prostředí: (Subscript[n, 2]) = ",ToString[n2]],20,barva,FontFamily->Times],{x1,y1+deltay},{Left,Bottom}],
Text[Style[StringJoin["α = ",ToString[alfa],"°"],20,barvadopad,FontFamily->Times],{x2,y2},{Right,Top}],
If[zobrazitodraz&&Abs[n1-n2]≠0,
Text[Style[StringJoin["α´ = ",ToString[alfa],"°"],20,barvaodraz,FontFamily->Times],{x2,y2-deltay},{Right,Top}],
Text[""]],
If[zobrazitlom&&chyba==False,
Text[Style[StringJoin["β = ",ToString[Round[beta,0.01]],"°"],20,barvalom,FontFamily->Times],{x2,y1},{Right,Bottom}],
Text[""]]},
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

{{alfa,alfa0,Style["α",20,barvaalfa,Italic]},0,90,1},
{{n1,n10,Style["(Subscript[n, 1])",20,barva,Italic]},nmin,nmax,deltan},
{{n2,n20,Style["(Subscript[n, 2])",20,barva,Italic]},nmin,nmax,deltan},
Delimiter,
{{zobrazitodraz,True,Style["odražený paprsek",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitlom,True,Style["lomený paprsek",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{zobrazitrychlosti,True,Style["velikost rychlosti",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{zobrazituhly,True,Style["zobrazit úhly",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazithodnoty,True,Style["zobrazit hodnoty",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{zobrazitzdroj,False,Style["zobrazit zdroj",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
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, 2008",10,Black,FontFamily->Times],"",Style["Zákon odrazu a lomu",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.

ZakonOdrazLom