Vrhy těles

Následující interaktivní notebook umožňuje znázornit vrhy těles v homogenním tíhovém poli. Pomocí posuvníků lze nastavit:
	hmotnost m tělesa tvaru koule;
	poloměr r tělesa tvaru koule;
	koeficient odporu k, v němž je započítán součinitel odporu (daný tvarem tělesa) a hustota prostředí.
Tyto parametry ovlivní zobrazení balistické křivky. V grafu se tedy jejich hodnoty projeví pouze tehdy, je-li zvolena možnost zobrazit balistickou křivku.

Dále lze nastavit parametry vrhu:
	počáteční výšku (Subscript[h, 0]) vrhu;
	velikost počáteční rychlosti (Subscript[v, 0]);
	elevační úhel α.

Volitelně lze dále zobrazit:
	vektor počáteční rychlosti;
	rozklad vektoru počáteční rychlosti do směru os kartézského systému souřadnic;
	vektor okamžité rychlosti;
	rozklad vektoru okamžité rychlosti do směru os kartézského systému souřadnic;
	důležité body křivky;
	balistickou křivku;
	hodnoty zadané pomocí posuvníků;
	hodnoty dopočítané.

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 může dojít k přepsání minule uložených obrázků.

© Jaroslav Reichl, 2010

Příprava pro vykreslení grafu

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

x1=0;x2=10;
y1=-2;y2=7;
stredx=0.5(x2-x1);stredy=0.5(y2-y1);
deltavypis=0.03x2;

gtihove=9.8065;

m0=1;mmin=0.25;mmax=5;deltam=0.05;
r0=0.5;rmin=0.05;rmax=2;deltar=0.05;
k0=0.6;kmin=0.05;kmax=2;deltak=0.05;
h0=0;hmin=0;hmax=5;deltah=(1/10);
v00=6;vmin=0;vmax=10;deltav=(1/10);
alfa0=(π/4);alfamin=-(π/2);alfamax=(π/2);deltaalfa=(π/60);
t0=0;tmin=0;tmax=2;deltat=(1/20);

tloustka=0.005;
velikostbodu=0.02;
velikostsipky=0.04;
velikostpisma=18;
polomeruhel=0.075(x2-x1);
koefv=0.5;

barva=Black;
barvakrivky=Blue;
barvabalkrivky=Magenta;
barvav0=Red;
barvav0x=Lighter[barvav0,0.3];
barvav0y=Darker[barvav0,0.4];
barvavaktualni=Orange;
barvavaktualnix=Lighter[barvavaktualni,0.2];
barvavaktualniy=Darker[barvavaktualni,0.4];
barvabodaktualni=Black;
barvaboduhmax=Darker[Cyan];
barvabodudopadu=Darker[Green,0.5];
barvavarovani=Red;

VrhyTeles=Manipulate[Deploy[
polohax[t_]:=v0 t Cos[alfa];
polohay[t_]:=h+v0 t Sin[alfa]-(1/2)gtihove (t^2);
vaktualnix[t_]=D[polohax[t],t];
vaktualniy[t_]=D[polohay[t],t];

resenidopad=Solve[polohay[tpom]==0,tpom];
t1pom=tpom/.resenidopad[[1]];
t2pom=tpom/.resenidopad[[2]];
tdopadu=Max[t1pom,t2pom];

resenihmax=Solve[vaktualniy[tpom]==0,tpom];
thmax=tpom/.resenihmax[[1]];
If[thmax<0,
thmax=0,
""];
bodhmax=Point[{polohax[thmax],polohay[thmax]}];
boddopadu=Point[{polohax[tdopadu],polohay[tdopadu]}];

(*Balistická křivka*)
silax[vx_]:=-((koefodporu π (polomer^2))/2) (vx^2);
silay[vy_]:=-gtihove m -((koefodporu π (polomer^2))/2)(vy^2);
resenidifx= Quiet[NDSolve[{m rx''[t]== silax[rx'[t]],rx[0]==0,rx'[0]==v0 Cos[alfa]},rx,{t,0,tdopadu}]];
resenidify =  Quiet[NDSolve[{m ry''[t]== silay[ry'[t]],ry[0]==h,ry'[0]==v0 Sin[alfa]},ry,{t,0, tdopadu}]];
balistikax=rx /.resenidifx[[1]];
balistikay=ry/.resenidify[[1]];
resenicasdopadu2 =Quiet[FindRoot[balistikay[tpom]==0,{tpom,((3 tdopadu)/4)}]];
tdopadubalistika=tpom/.resenicasdopadu2[[1]];

If[taktualni>tdopadu,
taktualni=tdopadu,
""];
bodaktualni=Point[{polohax[taktualni],polohay[taktualni]}];
vektorv0={
Arrowheads[{0,velikostsipky}],
Arrow[{{0,h},{koefv v0 Cos[alfa],h+koefv v0 Sin[alfa]}}]};
vektorv0x={
Arrowheads[{0,velikostsipky}],
Arrow[{{0,h},{koefv v0 Cos[alfa],h}}]};
vektorv0y={
Arrowheads[{0,velikostsipky}],
Arrow[{{0,h},{0,h+koefv v0 Sin[alfa]}}]};
rovnobeznikrozkladuv0=Line[{{koefv v0 Cos[alfa],h},{koefv v0 Cos[alfa],h+koefv v0 Sin[alfa]},{0,h+koefv v0 Sin[alfa]}}];
vektorvaktualni={
Arrowheads[{0,velikostsipky}],
Arrow[{{polohax[taktualni],polohay[taktualni]},{polohax[taktualni]+koefv vaktualnix[taktualni],polohay[taktualni]+koefv vaktualniy[taktualni]}}]};
vektorvaktualnix={
Arrowheads[{0,velikostsipky}],
Arrow[{{polohax[taktualni],polohay[taktualni]},{polohax[taktualni]+koefv vaktualnix[taktualni],polohay[taktualni]}}]};
vektorvaktualniy={
Arrowheads[{0,velikostsipky}],
Arrow[{{polohax[taktualni],polohay[taktualni]},{polohax[taktualni],polohay[taktualni]+koefv vaktualniy[taktualni]}}]};
rovnobeznikrozkladuvaktualni=Line[{{polohax[taktualni]+koefv vaktualnix[taktualni],polohay[taktualni]},{polohax[taktualni]+koefv vaktualnix[taktualni],polohay[taktualni]+koefv vaktualniy[taktualni]},{polohax[taktualni],polohay[taktualni]+koefv vaktualniy[taktualni]}}];
If[alfa≥0,
{startuhel=0,
konecuhel=alfa},
{startuhel=2π+alfa,
konecuhel=2π}];
uhel=Circle[{0,h},polomeruhel,{startuhel,konecuhel}];
carauhel=Line[{{0,h},{1.5polomeruhel,h}}];

(*Příprava výpisu*)
pishv0=StringJoin[ToString[Style["(Subscript[h, 0]) = ",barva],StandardForm],ToString[Style[ToString[Round[h,0.1]],barva],StandardForm],ToString[Style[" m",barva],StandardForm],ToString[Style["                  (Subscript[v, 0])",barvav0],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[v0,0.1]],barvav0],StandardForm],ToString[Style[" m.(s^(-1))",barva],StandardForm]];
pisalfa=StringJoin[ToString[Style["α = ",barva],StandardForm],ToString[Style[ToString[Round[((180.alfa)/π),0.1]],barva],StandardForm],ToString[Style[" °",barva],StandardForm]];
pisvxy0=StringJoin[ToString[Style["(Subscript[v, 0x])",barvav0x],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[vaktualnix[0],0.1]],barvav0x],StandardForm],ToString[Style[" m.(s^(-1))",barva],StandardForm],ToString[Style["         (Subscript[v, 0y])",barvav0y],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[vaktualniy[0],0.1]],barvav0y],StandardForm],ToString[Style[" m.(s^(-1))",barva],StandardForm]];
pisvxyaktualni=StringJoin[ToString[Style["(Subscript[v, x])",barvavaktualnix],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[vaktualnix[taktualni],0.1]],barvavaktualnix],StandardForm],ToString[Style[" m.(s^(-1))",barva],StandardForm],ToString[Style["           (Subscript[v, y])",barvavaktualniy],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[vaktualniy[taktualni],0.1]],barvavaktualniy],StandardForm],ToString[Style[" m.(s^(-1))",barva],StandardForm]];
pishmaxd=StringJoin[ToString[Style["(Subscript[h, m])",barvaboduhmax],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[polohay[thmax],0.1]],barvaboduhmax],StandardForm],ToString[Style[" m",barva],StandardForm],ToString[Style["               d",barvabodudopadu],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[polohax[tdopadu],0.1]],barvabodudopadu],StandardForm],ToString[Style[" m",barva],StandardForm]];
pisdopadbalistika=StringJoin[ToString[Style["(Subscript[d, bal])",barvabalkrivky],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[balistikax[tdopadubalistika],0.1]],barvabalkrivky],StandardForm],ToString[Style[" m",barva],StandardForm]];
pisvdopadu=StringJoin[ToString[Style["v",barvavaktualni],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[(Sqrt[((vaktualnix[taktualni])^2)+((vaktualniy[taktualni])^2)]),0.1]],barva],StandardForm],ToString[Style[" m.(s^(-1))",barva],StandardForm]];

grafik=Show[
If[tdopadu>0,
ParametricPlot[{polohax[t],polohay[t]},{t,0,tdopadu},PlotStyle->{barvakrivky,Thickness[tloustka]}],
Plot[0,{t,0,0.001},PlotStyle->{barva,Thickness[0.0001tloustka]}]],
If[zobrazitbalkrivku∧tdopadu>0,
ParametricPlot[{balistikax[t],balistikay[t]},{t,0,tdopadubalistika},PlotStyle->{barvabalkrivky,Thickness[tloustka]}],
Plot[0,{t,0,0.001},PlotStyle->{barva,Thickness[0.0001tloustka]}]],

Graphics[{
If[tdopadu>0,
{{barva,Dashed,Thickness[0.5tloustka],uhel},
{barva,Dashed,Thickness[0.5tloustka],carauhel},
Text[Style["α",15,barva,FontFamily->Times],{0.7polomeruhel Cos[(alfa/2)],h+0.7polomeruhel Sin[(alfa/2)]},{Center,Center}]},
Text[""]],
If[zobrazitv0∧tdopadu>0,
{{barvav0,Thickness[tloustka],vektorv0},
Text[Style["(Overscript[(Subscript[v, 0]), ⟶])",15,barvav0,FontFamily->Times],{koefv v0 Cos[alfa]+deltavypis,h+koefv v0 Sin[alfa]+deltavypis},{Center,Center}],
If[zobrazitrozkladv0,
{{barva,Thickness[0.5tloustka],Dashed,rovnobeznikrozkladuv0},
{barvav0x,Thickness[tloustka],vektorv0x},
{barvav0y,Thickness[tloustka],vektorv0y},
Text[Style["(Overscript[(Subscript[v, 0x]), ⟶])",15,barvav0x,FontFamily->Times],{koefv v0 Cos[alfa]+deltavypis,h+deltavypis},{Center,Center}],
Text[Style["(Overscript[(Subscript[v, 0y]), ⟶])",15,barvav0x,FontFamily->Times],{deltavypis,h+koefv v0 Sin[alfa]+deltavypis},{Center,Center}]},
Text[""]]},
Text[""]],
If[zobrazitvaktualni∧tdopadu>0,
{{barvavaktualni,Thickness[tloustka],vektorvaktualni},
{barvabodaktualni,PointSize[velikostbodu],bodaktualni},
Text[Style["(Overscript[v, ⟶])",15,barvavaktualni,FontFamily->Times],{polohax[taktualni]+koefv vaktualnix[taktualni]+deltavypis,polohay[taktualni]+koefv vaktualniy[taktualni]+deltavypis},{Center,Center}],
If[zobrazitrozkladvaktualni,
{{barva,Thickness[0.5tloustka],Dashed,rovnobeznikrozkladuvaktualni},
{barvavaktualnix,Thickness[tloustka],vektorvaktualnix},
{barvavaktualniy,Thickness[tloustka],vektorvaktualniy},
Text[Style["(Overscript[(Subscript[v, x]), ⟶])",15,barvavaktualnix,FontFamily->Times],{polohax[taktualni]+koefv vaktualnix[taktualni]+deltavypis,polohay[taktualni]+deltavypis},{Center,Center}],
Text[Style["(Overscript[(Subscript[v, y]), ⟶])",15,barvavaktualniy,FontFamily->Times],{polohax[taktualni]+deltavypis,polohay[taktualni]+koefv vaktualniy[taktualni]+deltavypis},{Center,Center}]},
Text[""]]},
Text[""]],
If[zobrazitbody∧tdopadu>0,
{{barvaboduhmax,PointSize[velikostbodu],bodhmax},
Text[Style["H",15,barvaboduhmax,FontFamily->Times],{polohax[thmax],polohay[thmax]+deltavypis},{Center,Center}],
{barvabodudopadu,PointSize[velikostbodu],boddopadu},
Text[Style["D",15,barvabodudopadu,FontFamily->Times],{polohax[tdopadu]+deltavypis,polohay[tdopadu]+deltavypis},{Center,Center}]},
Text[""]],
If[tdopadu≤0,
Text[Style["P O H Y B   N E L Z E   Z R E A L I Z O V A T !!!",18,barvavarovani,FontFamily->Times,Bold],{stredx,stredy},{Center,Center}],
Text[""]]
}],
FormatType->StandardForm,PlotRange->{{0,x2},{y1,y2}},Ticks->None,Axes->True,AxesLabel->{Style["x",15,barva,FontFamily->Times],Style["y",15,barva,FontFamily->Times]},ImageSize->500
]],

{{m,m0,Style["m",15,barva]},mmin,mmax,deltam},
{{polomer,r0,Style["r",15,barva]},rmin,rmax,deltar},
{{koefodporu,k0,Style["k",15,barva]},kmin,kmax,deltak},
Delimiter,
{{h,h0,Style["(Subscript[h, 0])",15,barva]},hmin,hmax,deltah},
{{v0,v00,Style["(Subscript[v, 0])",15,barvav0]},vmin,vmax,deltav},
{{alfa,alfa0,Style["α",15,barva]},alfamin,alfamax,deltaalfa},
Delimiter,
{{taktualni,t0,Style["t",15,barva]},tmin,tmax,deltat},
Delimiter,
Item[Style["Zobrazit",20,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitv0,True,Style["vektor (Overscript[(Subscript[v, 0]), ⟶])",15,barvav0,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitrozkladv0,False,Style["rozklad (Overscript[(Subscript[v, 0]), ⟶])",15,barvav0,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvaktualni,False,Style["vektor (Overscript[v, ⟶])",15,barvavaktualni,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitrozkladvaktualni,False,Style["rozklad (Overscript[v, ⟶])",15,barvavaktualni,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitbody,False,Style["body křivky",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitbalkrivku,False,Style["balistickou křivku",15,barvabalkrivky,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazithodnoty,False,Style["hodnoty dané",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvysledek,False,Style["hodnoty výsledné",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Dynamic[
Grid[{
{If[zobrazithodnoty,
Item[Style[pishv0,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazithodnoty,
Item[Style[pisalfa,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazithodnoty∧zobrazitv0∧zobrazitrozkladv0∧tdopadu>0,
Item[Style[pisvxy0,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazithodnoty∧zobrazitvaktualni∧zobrazitrozkladvaktualni∧tdopadu>0,
Item[Style[pisvxyaktualni,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitvysledek∧zobrazitvaktualni∧zobrazitrozkladvaktualni,
Item[Style[pisvdopadu,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitvysledek∧tdopadu>0,
Item[Style[pishmaxd,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitvysledek∧zobrazitbalkrivku∧tdopadubalistika>0,
Item[Style[pisdopadbalistika,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]}
}]],
Delimiter,
Button[" Ulož obrázek ",{pocetulozeni=pocetulozeni+1,Export[StringInsert[StringJoin[cesta,jmenosouboru],ToString[pocetulozeni],-5],grafik]},ImageSize->{100,Automatic}],
ControlPlacement->{Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Left,Bottom},
FrameLabel->{Style["© Vojtěch Myslivec, Jaroslav Reichl, Cyril Šup, 2010",10,Black,FontFamily->Times],"",Style["Vrhy těles",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.

VrhyTeles