Testování hodnot goniometrických funkcí

Následující aplet umožňuje rychle testovat znalost funkčních hodnot goniometrických funkcí sin (x), cos(x), tg(x) a cotg(x) s využitím zobrazení zadaného argumentu v jednotkové kružnici.
Argument funkce, který je vždy násobkem π je generován automaticky s přihlédnutím k volbám pouze kladného hodnoty úhlů a pouze z intervalu <0; 2π).

Goniometrickou funkci je možné vybrat z roletky, v níž jsou kromě základních funkcí (sin (x), cos(x), tg(x) a cotg(x)) také dvě dvojice (sin (x) a cos (x), tg (x) a cotg (x)) a možnost vše. V těchto případech se goniometrická funkce vybere náhodně. Tato volba je zde z didaktických důvodů - goniometrické funkce se většinou probírají po dvou: sinus a kosinus najednou a poté najednou tangens a kotangens.
Volitelně lze zobrazit jednotkovou kružnici včetně "definice" právě vybrané goniometrické funkce a daného argumentu.
Dále je možné jak při výpočtu tak na jednotkové kružnici zobrazit úhel v prvním kvadrantu kartézského systému souřadnic, pomocí kterého lze určit příslušnou funkční hodnotu.

Čas na úlohu lze nastavit kdykoliv během běhu apletu, ale projeví se při generování další úlohy. Po uplynutí tohoto času se zobrazí na 5 sekund řešení úlohy.

Tlačítkem Spustit se spustí náhodné generování úloh.
Tlačítkem Zastavit lze v kterékoliv fázi výpočtu jeho běh zastavit.
Tlačítkem Ulož obrázek se uloží právě zobrazený pracovní prostor (tj. bílý obdélník) 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. Soubor je uložen ve formátu *.JPG.
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

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

x1=-10;x2=10;
y1=0;y2=10;
t0=5;tmin=5;tmax=60;deltat=5;
casnareseni=5;
deltax=1;deltay=2;
stredx=((x1+x2)/2);stredy=((y1+y2)/2);
polomer=0.3x2;
stredkcex=x2-1.6polomer;
stredkcey=y2-1.6polomer;

seznamfci={"sin (x)","cos (x)","sin (x) a cos (x)","tg (x)","cotg (x)","tg (x) a cotg (x)","vše"};
defaultnifce=seznamfci[[7]];
minulavybranafce="";

pocetkroku=0;
dalsipriklad=False;
poprve=True;
okzadani=False;
jmenovatele={3,4,6,6};
(*Číslice 1 a 2 jsou vynechány proto, že po automatickém vygenerování čitatele a jmenovatele zlomku je tento zlomek zkrácen do základního tvaru. Vynecháním číslic 1 a 2 zvyšujeme pravděpodobnost výskytu argumentů, které nejsou celočíselnými násobky ((π )/2) a jejichž funkční hodnoty se určují většinou snadněji. Analogicky je uvedena v seznamu dvakrát číslice 6.*)
dolnimezcitatele=1;
hornimezcitatele=200;
dolnimezjmenovatele=1;
hornimezjmenovatele=25;

barva=Black;
barvakce=Black;
barvapruvodic=Black;
barvauhel=Darker[Red,0.4];
barvauhel1=Lighter[Red,0.2];
barvavarovani=Red;
barvasin=Lighter[Blue,0.2];
barvacos=Lighter[Orange,0.2];
barvatg=Darker[Green,0.3];
barvacotg=Magenta;

tloustka=0.004;
osax=Line[{{stredkcex-1.5polomer,stredkcey},{stredkcex+1.5polomer,stredkcey}}];
osay=Line[{{stredkcex,stredkcey-1.5polomer},{stredkcex,stredkcey+1.5polomer}}];
kruznice=Circle[{stredkcex,stredkcey},polomer];

TestovaniGoniometrie=Manipulate[
If[dalsipriklad,
{dalsipriklad=False,
casnaulohu=zadanycas,
okzadani=True,
fijmenovatel=RandomChoice[jmenovatele],
If[pouzedo2pi,
If[pouzekladne,
ficitatel=RandomInteger[{1,2fijmenovatel}],
ficitatel=RandomChoice[{-1,1}]*RandomInteger[{1,2fijmenovatel}]],
If[pouzekladne,
ficitatel=RandomInteger[{dolnimezcitatele,hornimezcitatele}],
ficitatel=RandomChoice[{-1,1}]*RandomInteger[{dolnimezcitatele,hornimezcitatele}]]]},
""];
If[okzadani,
{If[minulavybranafce≠vybranafce,
{minulavybranafce=vybranafce,
caszacatku=AbsoluteTime[],
If[vybranafce==seznamfci[[1]],
{goniomfce[x_]=Sin[x],
nazevfce="sin"},
If[vybranafce==seznamfci[[2]],
{goniomfce[x_]=Cos[x],
nazevfce="cos"},
If[vybranafce==seznamfci[[3]],
{If[RandomInteger[{1,2}]==1,
{goniomfce[x_]=Sin[x],
nazevfce="sin"},
{goniomfce[x_]=Cos[x],
nazevfce="cos"}]},
If[vybranafce==seznamfci[[4]],
{goniomfce[x_]=Tan[x],
nazevfce="tg"},
If[vybranafce==seznamfci[[5]],
{goniomfce[x_]=Cot[x],
nazevfce="cotg"},
If[vybranafce==seznamfci[[6]],
{If[RandomInteger[{1,2}]==1,
{goniomfce[x_]=Tan[x],
nazevfce="tg"},
{goniomfce[x_]=Cot[x],
nazevfce="cotg"}]},
If[vybranafce==seznamfci[[7]],
{pomocna=RandomInteger[{1,4}],
If[pomocna==1,
{goniomfce[x_]=Sin[x],
nazevfce="sin"},
If[pomocna==2,
{goniomfce[x_]=Cos[x],
nazevfce="cos"},
If[pomocna==3,
{goniomfce[x_]=Tan[x],
nazevfce="tg"},
{goniomfce[x_]=Cot[x],
nazevfce="cotg"}]]]}]]]]]]]},
""],
fi=(ficitatel/fijmenovatel)π,
perioda=2π,
fido2pi=Mod[fi,perioda],
obehy=fi-fido2pi,
pruvodic=Line[{{stredkcex,stredkcey},{stredkcex+polomer Cos[fi],stredkcey+polomer Sin[fi]}}],
uhelfi=Circle[{stredkcex,stredkcey},0.65polomer,{0,fido2pi}],
If[prvnikvadrant,
If[fido2pi≤(π/2),
fi1=fido2pi,
If[fido2pi≤π,
fi1=π-fido2pi,
If[fido2pi≤((3π)/2),
fi1=fido2pi-π,
fi1=2π-fido2pi]]],
""],
uhelfi1={Circle[{stredkcex,stredkcey},0.4polomer,{0,fi1}],
Circle[{stredkcex,stredkcey},0.45polomer,{0,fi1}]},
If[NumberQ[goniomfce[fido2pi]],
If[Sign[goniomfce[fido2pi]]≥0,
kvadrant="",
kvadrant="- "],
kvadrant=""],
bodx=stredkcex+polomer Cos[fi];body=stredkcey+polomer Sin[fi];
bodx1=stredkcex+polomer Cos[fi1];body1=stredkcey+polomer Sin[fi1];
If[nazevfce=="sin",
{fceline=Line[{{bodx,stredkcey},{bodx,body}}],
fceline1=Line[{{bodx1,stredkcey},{bodx1,body1}}],
fcepruvodic=Line[{{stredkcex,stredkcey},{bodx,body}}],
fcepruvodic1=Line[{{stredkcex,stredkcey},{bodx1,body1}}],
barvafce=barvasin},
If[nazevfce=="cos",
{fceline=Line[{{stredkcex,body},{bodx,body}}],
fceline1=Line[{{stredkcex,body1},{bodx1,body1}}],
fcepruvodic=Line[{{stredkcex,stredkcey},{bodx,body}}],
fcepruvodic1=Line[{{stredkcex,stredkcey},{bodx1,body1}}],
barvafce=barvacos},
If[nazevfce=="tg",
{fceline=Line[{{stredkcex+polomer,stredkcey},{stredkcex+polomer,stredkcey+polomer Tan[fi]}}],
fceline1=Line[{{stredkcex+polomer,stredkcey},{stredkcex+polomer,stredkcey+polomer Tan[fi1]}}],
fcepruvodic=Line[{{stredkcex,stredkcey},{stredkcex+polomer,stredkcey+polomer Tan[fi]}}],
fcepruvodic1=Line[{{stredkcex,stredkcey},{stredkcex+polomer,stredkcey+polomer Tan[fi1]}}],
barvafce=barvatg},
{fceline=Line[{{stredkcex,stredkcey+polomer},{stredkcex+polomer Cot[fi],stredkcey+polomer}}],
fceline1=Line[{{stredkcex,stredkcey+polomer},{stredkcex+polomer Cot[fi1],stredkcey+polomer}}],
fcepruvodic=Line[{{stredkcex,stredkcey},{stredkcex+polomer Cot[fi],stredkcey+polomer}}],
fcepruvodic1=Line[{{stredkcex,stredkcey},{stredkcex+polomer Cot[fi1],stredkcey+polomer}}],
barvafce=barvacotg}]]],
If[caszacatku+casnaulohu+casnareseni-0.5≤Refresh[AbsoluteTime[],UpdateInterval->0.1],
{dalsipriklad=True,
minulavybranafce=""},
""]},
""];

grafik=Deploy[
Show[
Graphics[{
If[okzadani&&poprve==False,
{Text[Style[StringJoin[nazevfce," ( ",ToString[fi,TraditionalForm]," ) ="],15,barva,FontFamily->Times],{x1,y2-deltay},{Left,Center}],
If[caszacatku+casnaulohu-0.5≤AbsoluteTime[],
{If[zobrazitkci,
{{barva,Thickness[0.5tloustka],osax},
{barva,Thickness[0.5tloustka],osay},
{barvakce,Thickness[tloustka],kruznice},
Text[Style["x",15,barva,FontFamily->Times],{stredkcex+1.5polomer,stredkcey+0.04y1},{Left,Center}],
Text[Style["y",15,barva,FontFamily->Times],{stredkcex+0.03x2,stredkcey+1.5polomer},{Left,Center}],
{barvapruvodic,Thickness[0.5tloustka],pruvodic},
{barvauhel,Thickness[0.5tloustka],uhelfi},
If[NumberQ[1.goniomfce[fido2pi]],
{{barvafce,Thickness[1.8tloustka],fceline},
{barvapruvodic,Dotted,Thickness[0.3tloustka],fcepruvodic}},
Text[""]]},
Text[""]],
Text[Style[StringJoin["= ",nazevfce," ( ",ToString[Style[ToString[fido2pi,TraditionalForm],barvauhel],StandardForm]," ) = "],15,barva,FontFamily->Times],{x1,y2-2*deltay},{Left,Center}],
If[prvnikvadrant,
{Text[Style[StringJoin["= ",kvadrant,nazevfce," ( ",ToString[Style[ToString[fi1,TraditionalForm],barvauhel1],StandardForm]," ) ="],15,barva,FontFamily->Times],{x1,y2-3*deltay},{Left,Center}],
If[zobrazitkci,
{{barvauhel1,Thickness[0.5tloustka],uhelfi1},
If[NumberQ[1.goniomfce[fi1]],
{{barvapruvodic,Dotted,Thickness[0.5tloustka],fcepruvodic1},
{barvafce,Thickness[0.8tloustka],fceline1}},
Text[""]]},
Text[""]],
If[NumberQ[1.goniomfce[fido2pi]],
If[Length[Abs[goniomfce[fido2pi]]]==1,
Text[Style[StringJoin["= ",ToString[Round[goniomfce[fido2pi],0.00001]]],15,barva,FontFamily->Times],{x1,y2-4*deltay},{Left,Center}],
Text[Style[StringJoin["= ",ToString[goniomfce[fido2pi],TraditionalForm]],15,barva,FontFamily->Times],{x1,y2-4*deltay},{Left,Center}]],
Text[Style["N E N Í   D E F I N O V Á N O",20,barvavarovani,FontFamily->Times,Bold],{x1,y2-4*deltay},{Left,Center}]]},
If[NumberQ[1.goniomfce[fido2pi]],
If[Length[Abs[goniomfce[fido2pi]]]==1,
Text[Style[StringJoin["= ",ToString[Round[goniomfce[fido2pi],0.00001]]],15,barva,FontFamily->Times],{x1,y2-3*deltay},{Left,Center}],
Text[Style[StringJoin["= ",ToString[goniomfce[fido2pi],TraditionalForm]],15,barva,FontFamily->Times],{x1,y2-3*deltay},{Left,Center}]],
Text[Style["N E N Í   D E F I N O V Á N O",20,barvavarovani,FontFamily->Times,Bold],{x1,y2-3*deltay},{Left,Center}]]],
Text[Style[StringJoin["Další úloha za: ",ToString[Round[caszacatku+casnaulohu+casnareseni-AbsoluteTime[]]]," s"],15,barva,FontFamily->Times],{x1,y1-deltay},{Left,Bottom}]},
Text[Style[StringJoin["Na řešení zbývá: ",ToString[Round[caszacatku+casnaulohu-AbsoluteTime[]]]," s"],15,barva,FontFamily->Times],{x1,y1-deltay},{Left,Bottom}]]},
If[poprve==False,
Text[Style["N E N Í   Z A D Á N A   Č Í S E L N Á   H O D N O T A",17,barvavarovani,FontFamily->Times,Bold],{stredx,stredy},{Center,Center}],
Text[Style["Úlohy se začnou generovat stiskem tlačítka 'Spustit'.",17,barvavarovani,FontFamily->Times,Bold],{stredx,stredy},{Center,Center}]]]
}],
FormatType->StandardForm,
AxesLabel->{"x","y"},AspectRatio->Automatic,PlotRange->{{x1-deltax,x2+deltax},{y1-deltay,y2}},ImageSize->420
]],

{{zadanycas,t0,Style["čas na úlohu",15,barva,FontFamily->Times]},tmin,tmax,deltat,Appearance->"Labeled"},
{{pouzedo2pi,True,Style["pouze z intervalu <0; 2π)",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{pouzekladne,False,Style["pouze kladné hodnoty úhlů",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{vybranafce,defaultnifce,Style["goniometrická funkce",15,barva,FontFamily->Times]},seznamfci,ControlType->PopupMenu},
Delimiter,
Item[Style["Zobrazit",15,barva,FontFamily->Times,Bold,Underlined]],
{{zobrazitkci,True,Style["jednotkovou kružnici",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{prvnikvadrant,True,Style["úhel z I. kvadrantu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Button[" Spustit ",{
poprve=False,
dalsipriklad=True,
caszacatku=AbsoluteTime[],
minulavybranafce=""},ImageSize->{100,Automatic}],
Button[" Zastavit ",{
poprve=True,
dalsipriklad=False},ImageSize->{100,Automatic}],
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["Testování hodnot goniometrických funkcí",25,Black,FontFamily->Times],""}];

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

TestovaniGoniometrie