Trojúhelník

Následující aplet zobrazuje základní vlastnosti trojúhelníka, které lze volitelně zobrazovat:
	středy stran;
	střední příčky;
	těžnice;
	výšky;
	osy stran;
	kružnice opsaná troúhelníku;
	osy úhlů;
	kružnice vepsaná trojúhelníku;
	popis bodů (vrcholy trojúhelníka, středy stran, těžiště, orthocentrum, středy kružnic);
	metrické vlastnosti (délky stran, obvod, obsah, hodnoty vnitřních úhlů).

Rozměry a tvar trojúhelníku lze měnit tažením myši (při stisknutém levém tlačítku) za jednotlivé vrcholy. Tímto tažením lze (aniž by to v apletu bylo ošetřeno) jednotlivé vrcholy dostat do libovolné vzájemné polohy (a tedy např. i do polohy, v níž budou všechny tři body ležet na jedné přímce).
Při zobrazení všech výše uvedených charakteristik se stane obrázek velmi nepřehledný. Při zobrazeném popisu se nepopisují přímky (osy stran, osy úhlů, těžnice, výšky) a není ošetřeno, aby se popisky nezobrazovaly přes sebe.

Nevyhovuje-li popis trojúhelníka pomocí písmen A, B a C lze do proměnné prvnipismeno zadat počáteční písmeno, kterým počínajíc se mají vrcholy popsat.

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, 2009

Příprava pro vykreslení grafu

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

x1=-10;x2=-x1;
y1=-10;y2=-y1;

pocetvrcholu=3;
prvnipismeno="A";
tloustka=0.005;
velikostbodu=0.02;
prvnibeh=True;

barva=Black;
barvaos=Black;
barvaosuhlu=Magenta;
barvastredu=Blue;
barvautvaru=Lighter[barvastredu,0.55];
barvabodu=Red;
barvaopsanekce=Black;
barvavepsanekce=Darker[Magenta];
barvateznice=Darker[Orange,0.5];
barvavysky=Darker[Green,0.5];

ZobrazeniTrojuhelnika=Manipulate[Deploy[
If[prvnibeh,
{vrcholy={{0.5(x1+x2),0.9x2 Tan[(π/3)]-0.9y2+0.05(y2-y1)},{0.9x1,0.9y1+0.05(y2-y1)},{0.9x2,0.9y1+0.05(y2-y1)}},
vrcholy=PadRight[vrcholy,pocetvrcholu+1,{vrcholy[[1]]}],(*Kvůli snadnějšímu vykreslování útvaru a dalším výpočtům.*)
prvnibeh=False},
{vrcholy=PadRight[vrcholy,pocetvrcholu+1,RandomReal[{x1,x2},{pocetvrcholu,2}]],
vrcholy[[pocetvrcholu+1]]=vrcholy[[1]](*Kvůli snadnějšímu vykreslování útvaru a dalším výpočtům.*)}];
svektor=Table[vrcholy[[i+1]]-vrcholy[[i]],{i,1,pocetvrcholu}];
svektor=PadRight[svektor,pocetvrcholu+1,{svektor[[1]]}];
nvektor=Table[{svektor[[i,2]],-svektor[[i,1]]},{i,1,pocetvrcholu+1}];
stredstrany=Table[((vrcholy[[i+1]]+vrcholy[[i]])/2),{i,1,pocetvrcholu}];
stredstrany=PadRight[stredstrany,pocetvrcholu+1,{stredstrany[[1]]}];
svektorteznice=Table[stredstrany[[i+1]]-vrcholy[[i]],{i,1,pocetvrcholu}];
delkastrany=Table[(Sqrt[((svektor[[i,1]])^2)+((svektor[[i,2]])^2)]),{i,1,pocetvrcholu}];
delkastrany=PadRight[delkastrany,pocetvrcholu+1,{delkastrany[[1]]}];
uhel=Table[ArcCos[((-Sum[svektor[[i-1,j]] svektor[[i,j]],{j,1,2,1}])/(delkastrany[[i-1]] delkastrany[[i]]))],{i,2,pocetvrcholu+1}];

reseni=Solve[{stredstrany[[1,1]]+param1 nvektor[[1,1]]==stredstrany[[2,1]]+param2 nvektor[[2,1]],stredstrany[[1,2]]+param1 nvektor[[1,2]]==stredstrany[[2,2]]+param2 nvektor[[2,2]]},{param1,param2}];
paramvyp1=param1/.reseni[[1,1]];
paramvyp2=param2/.reseni[[1,2]];
stredopsanekcex=stredstrany[[1,1]]+paramvyp1 nvektor[[1,1]];
stredopsanekcey=stredstrany[[1,2]]+paramvyp1 nvektor[[1,2]];
obvod=Sum[delkastrany[[i]],{i,1,pocetvrcholu,1}];
obsah=(Sqrt[(obvod/2)((obvod/2)-delkastrany[[1]])((obvod/2)-delkastrany[[2]])((obvod/2)-delkastrany[[3]])]);
polomeropsanekce=((delkastrany[[1]] delkastrany[[2]] delkastrany[[3]])/(4obsah));
polomervepsanekce=((2obsah)/obvod);

reseni=Solve[{vrcholy[[1,1]]+param1 svektorteznice[[1,1]]==vrcholy[[2,1]]+param2 svektorteznice[[2,1]],vrcholy[[1,2]]+param1 svektorteznice[[1,2]]==vrcholy[[2,2]]+param2 svektorteznice[[2,2]]},{param1,param2}];
paramvyp1=param1/.reseni[[1,1]];
tezistex=vrcholy[[1,1]]+paramvyp1 svektorteznice[[1,1]];
tezistey=vrcholy[[1,2]]+paramvyp1 svektorteznice[[1,2]];

(*Výpočet pat výšek*)
reseni=Solve[{vrcholy[[1,1]]+param1 nvektor[[2,1]]==vrcholy[[2,1]]+param2 svektor[[2,1]],vrcholy[[1,2]]+param1 nvektor[[2,2]]==vrcholy[[2,2]]+param2 svektor[[2,2]]},{param1,param2}];
paramvyp1=param1/.reseni[[1,1]];
patavysky={};
patavysky=PadRight[patavysky,1,{{vrcholy[[1,1]]+paramvyp1 nvektor[[2,1]],vrcholy[[1,2]]+paramvyp1 nvektor[[2,2]]}}];
reseni=Solve[{vrcholy[[2,1]]+param1 nvektor[[3,1]]==vrcholy[[3,1]]+param2 svektor[[3,1]],vrcholy[[2,2]]+param1 nvektor[[3,2]]==vrcholy[[3,2]]+param2 svektor[[3,2]]},{param1,param2}];
paramvyp1=param1/.reseni[[1,1]];
patavysky=PadRight[patavysky,2,{{vrcholy[[2,1]]+paramvyp1 nvektor[[3,1]],vrcholy[[2,2]]+paramvyp1 nvektor[[3,2]]}}];
reseni=Solve[{vrcholy[[3,1]]+param1 nvektor[[1,1]]==vrcholy[[1,1]]+param2 svektor[[1,1]],vrcholy[[3,2]]+param1 nvektor[[1,2]]==vrcholy[[1,2]]+param2 svektor[[1,2]]},{param1,param2}];
paramvyp1=param1/.reseni[[1,1]];
patavysky=PadRight[patavysky,3,{{vrcholy[[3,1]]+paramvyp1 nvektor[[1,1]],vrcholy[[3,2]]+paramvyp1 nvektor[[1,2]]}}];

(*Výpočet orthocentra*)
reseni=Solve[{vrcholy[[1,1]]+param1 nvektor[[2,1]]==vrcholy[[2,1]]+param2 nvektor[[3,1]],vrcholy[[1,2]]+param1 nvektor[[2,2]]==vrcholy[[2,2]]+param2 nvektor[[3,2]]},{param1,param2}];
paramvyp1=param1/.reseni[[1,1]];
orthocentrumx=vrcholy[[1,1]]+paramvyp1 nvektor[[2,1]];
orthocentrumy=vrcholy[[1,2]]+paramvyp1 nvektor[[2,2]];

(*Výpočet os úhlů*)
(*Osy úhlů jsou vypočítány "fintou":
- najdeme dvě přímky, z nichž každá je rovnoběžná s jednou stranou trojúhelníka, prochází ve vzdálenosti polomervepsanekce od této strany a leží ve vnitřní oblasti trojúhelníka,
- průsečík těchto dvou přímek je střed kružnice vepsané a tedy jím procházejí všechny tři osy úhlů*)
reseni=Solve[{patavysky[[1,1]]+(vrcholy[[1,1]]-patavysky[[1,1]])(polomervepsanekce/(Sqrt[(((vrcholy[[1,1]]-patavysky[[1,1]]))^2)+(((vrcholy[[1,2]]-patavysky[[1,2]]))^2)]))+param1 svektor[[2,1]]==patavysky[[2,1]]+(vrcholy[[2,1]]-patavysky[[2,1]])(polomervepsanekce/(Sqrt[(((vrcholy[[2,1]]-patavysky[[2,1]]))^2)+(((vrcholy[[2,2]]-patavysky[[2,2]]))^2)]))+param2 svektor[[3,1]],patavysky[[1,2]]+(vrcholy[[1,2]]-patavysky[[1,2]])(polomervepsanekce/(Sqrt[(((vrcholy[[1,1]]-patavysky[[1,1]]))^2)+(((vrcholy[[1,2]]-patavysky[[1,2]]))^2)]))+param1 svektor[[2,2]]==patavysky[[2,2]]+(vrcholy[[2,2]]-patavysky[[2,2]])(polomervepsanekce/(Sqrt[(((vrcholy[[2,1]]-patavysky[[2,1]]))^2)+(((vrcholy[[2,2]]-patavysky[[2,2]]))^2)]))+param2 svektor[[3,2]]},{param1,param2}];
paramvyp1=param1/.reseni[[1,1]];
stredvepsanekcex=patavysky[[1,1]]+(vrcholy[[1,1]]-patavysky[[1,1]])(polomervepsanekce/(Sqrt[(((vrcholy[[1,1]]-patavysky[[1,1]]))^2)+(((vrcholy[[1,2]]-patavysky[[1,2]]))^2)]))+paramvyp1 svektor[[2,1]];
stredvepsanekcey=patavysky[[1,2]]+(vrcholy[[1,2]]-patavysky[[1,2]])(polomervepsanekce/(Sqrt[(((vrcholy[[1,1]]-patavysky[[1,1]]))^2)+(((vrcholy[[1,2]]-patavysky[[1,2]]))^2)]))+paramvyp1 svektor[[2,2]];

grafik=Show[
Graphics[{
Table[{barvautvaru,Thickness[tloustka],Line[{vrcholy[[i]],vrcholy[[i+1]]}]},{i,1,pocetvrcholu}],
Table[{barvabodu,PointSize[velikostbodu],Point[vrcholy[[i]]]},{i,1,pocetvrcholu}],
If[zobrazitpopis,
Table[Text[Style[FromCharacterCode[ToCharacterCode[prvnipismeno]+i-2],15,barvabodu,FontFamily->Times,Bold],{vrcholy[[i,1]]+0.7((svektor[[i-1,1]]-svektor[[i,1]])/(Sqrt[(((svektor[[i-1,1]]-svektor[[i,1]]))^2)+(((svektor[[i-1,2]]-svektor[[i,2]]))^2)])),vrcholy[[i,2]]+0.7((svektor[[i-1,2]]-svektor[[i,2]])/(Sqrt[(((svektor[[i-1,1]]-svektor[[i,1]]))^2)+(((svektor[[i-1,2]]-svektor[[i,2]]))^2)]))},{Center,Center}],{i,2,pocetvrcholu+1}],
Text[""]],
If[zobrazitstredystran,
{Table[{barvastredu,PointSize[0.8velikostbodu],Point[stredstrany[[i]]]},{i,1,pocetvrcholu}],
If[zobrazitpopis,
{Text[Style[Subscript["S",StringJoin[FromCharacterCode[ToCharacterCode[prvnipismeno]+2],FromCharacterCode[ToCharacterCode[prvnipismeno]]]],15,barvastredu,FontFamily->Times,Bold],{stredstrany[[1,1]]+0.8((stredstrany[[1,1]]-tezistex)/(Sqrt[(((stredstrany[[1,1]]-tezistex))^2)+(((stredstrany[[1,2]]-tezistey))^2)])),stredstrany[[1,2]]+0.8((stredstrany[[1,2]]-tezistey)/(Sqrt[(((stredstrany[[1,1]]-tezistex))^2)+(((stredstrany[[1,2]]-tezistey))^2)]))},{Center,Center}],
Text[Style[Subscript["S",StringJoin[FromCharacterCode[ToCharacterCode[prvnipismeno]],FromCharacterCode[ToCharacterCode[prvnipismeno]+1]]],15,barvastredu,FontFamily->Times,Bold],{stredstrany[[2,1]]+0.8((stredstrany[[2,1]]-tezistex)/(Sqrt[(((stredstrany[[2,1]]-tezistex))^2)+(((stredstrany[[1,2]]-tezistey))^2)])),stredstrany[[2,2]]+0.8((stredstrany[[2,2]]-tezistey)/(Sqrt[(((stredstrany[[2,1]]-tezistex))^2)+(((stredstrany[[2,2]]-tezistey))^2)]))},{Center,Center}],
Text[Style[Subscript["S",StringJoin[FromCharacterCode[ToCharacterCode[prvnipismeno]+1],FromCharacterCode[ToCharacterCode[prvnipismeno]+2]]],15,barvastredu,FontFamily->Times,Bold],{stredstrany[[3,1]]+0.8((stredstrany[[3,1]]-tezistex)/(Sqrt[(((stredstrany[[3,1]]-tezistex))^2)+(((stredstrany[[3,2]]-tezistey))^2)])),stredstrany[[3,2]]+0.8((stredstrany[[3,2]]-tezistey)/(Sqrt[(((stredstrany[[3,1]]-tezistex))^2)+(((stredstrany[[3,2]]-tezistey))^2)]))},{Center,Center}]},
Text[""]]},
Text[""]],
If[zobrazitosystran,
{Table[{barvaos,Dashed,Thickness[0.1tloustka],Line[{{stredstrany[[i,1]],stredstrany[[i,2]]},{stredopsanekcex,stredopsanekcey}}]},{i,1,pocetvrcholu}],
Table[{barvaos,Dashed,Thickness[0.1tloustka],Line[{{stredstrany[[i,1]]-0.5nvektor[[i,1]],stredstrany[[i,2]]-0.5nvektor[[i,2]]},{stredstrany[[i,1]]+0.5nvektor[[i,1]],stredstrany[[i,2]]+0.5nvektor[[i,2]]}}]},{i,1,pocetvrcholu}]},
Text[""]],
If[zobrazitpricky,
Table[{barvastredu,Thickness[0.8tloustka],Line[{stredstrany[[i]],stredstrany[[i+1]]}]},{i,1,pocetvrcholu}],
Text[""]],
If[zobrazitopsanoukci,
{{barvaopsanekce,PointSize[0.8velikostbodu],Point[{stredopsanekcex,stredopsanekcey}]},
{barvaopsanekce,Thickness[tloustka],Circle[{stredopsanekcex,stredopsanekcey},polomeropsanekce]},
If[zobrazitpopis,
{Text[Style["(Subscript[S, o])",15,barvaopsanekce,FontFamily->Times,Bold],{stredopsanekcex-0.02(x2-x1),stredopsanekcey+0.02(y2-y1)},{Center,Center}]},
Text[""]]},
Text[""]],
If[zobrazitvepsanoukci,
{{barvavepsanekce,PointSize[0.8velikostbodu],Point[{stredvepsanekcex,stredvepsanekcey}]},
{barvavepsanekce,Thickness[tloustka],Circle[{stredvepsanekcex,stredvepsanekcey},polomervepsanekce]},
If[zobrazitpopis,
{Text[Style["(Subscript[S, v])",15,barvavepsanekce,FontFamily->Times,Bold],{stredvepsanekcex-0.02(x2-x1),stredvepsanekcey+0.02(y2-y1)},{Center,Center}]},
Text[""]]},
Text[""]],
If[zobrazitteznice,
{{barvateznice,PointSize[0.8velikostbodu],Point[{tezistex,tezistey}]},
If[zobrazitpopis,
{Text[Style["T",15,barvateznice,FontFamily->Times,Bold],{tezistex-0.02(x2-x1),tezistey+0.02(y2-y1)},{Center,Center}]},
Text[""]]},
Text[""]],
If[zobrazitvysky,
{Table[{barvavysky,Dashed,Thickness[0.2tloustka],Line[{vrcholy[[i]],patavysky[[i]]}]},{i,1,pocetvrcholu}],
Table[{barvavysky,Dashed,Thickness[0.2tloustka],Line[{{vrcholy[[i,1]],vrcholy[[i,2]]},{orthocentrumx,orthocentrumy}}]},{i,1,pocetvrcholu}],
Table[{barvautvaru,Dashed,Thickness[0.1tloustka],Line[{vrcholy[[i+1]],patavysky[[i]]}]},{i,1,pocetvrcholu}],
{barvavysky,PointSize[0.8velikostbodu],Point[{orthocentrumx,orthocentrumy}]},
If[zobrazitpopis,
{Text[Style["O",15,barvavysky,FontFamily->Times,Bold],{orthocentrumx-0.02(x2-x1),orthocentrumy+0.02(y2-y1)},{Center,Center}]},
Text[""]]},
Text[""]]
}],
If[zobrazitteznice,
Table[ParametricPlot[{vrcholy[[i,1]]+t svektorteznice[[i,1]],vrcholy[[i,2]]+t svektorteznice[[i,2]]},{t,0,1},PlotStyle->{barvateznice,Dashed,Thickness[0.2tloustka]}],{i,1,pocetvrcholu}],
Plot[1.1x1,{x,0,0.1},PlotStyle->{White}]],
If[zobrazitosyuhlu,
Table[ParametricPlot[{vrcholy[[i,1]]+t (stredvepsanekcex-vrcholy[[i,1]]),vrcholy[[i,2]]+t (stredvepsanekcey-vrcholy[[i,2]])},{t,0,2},PlotStyle->{barvaosuhlu,Dashed,Thickness[0.2tloustka]}],{i,1,pocetvrcholu}],
Plot[1.1x1,{x,0,0.1},PlotStyle->{White}]],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

{{vrcholy,{{0,0}}},Locator,Appearance->""},
Delimiter,
Item[Style["Zobrazit",15,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitstredystran,False,Style["středy stran",15,barvastredu,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitpricky,False,Style["střední příčky",15,barvastredu,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitteznice,False,Style["těžnice",15,barvateznice,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvysky,False,Style["výšky",15,barvavysky,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{zobrazitosystran,False,Style["osy stran",15,barvaos,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitopsanoukci,False,Style["opsaná kružnice",15,barvaopsanekce,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitosyuhlu,False,Style["osy úhlů",15,barvaosuhlu,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvepsanoukci,False,Style["vepsaná kružnice",15,barvavepsanekce,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{zobrazitpopis,True,Style["popis",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitmetrickevlastnosti,True,Style["metrické vlastnosti",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Dynamic[
Grid[{
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["\[LeftBracketingBar]",FromCharacterCode[ToCharacterCode[prvnipismeno]],FromCharacterCode[ToCharacterCode[prvnipismeno]+1],"\[RightBracketingBar] = ",ToString[Round[delkastrany[[2]],0.01]]," j"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["\[LeftBracketingBar]",FromCharacterCode[ToCharacterCode[prvnipismeno]+1],FromCharacterCode[ToCharacterCode[prvnipismeno]+2],"\[RightBracketingBar] = ",ToString[Round[delkastrany[[3]],0.01]]," j"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["\[LeftBracketingBar]",FromCharacterCode[ToCharacterCode[prvnipismeno]],FromCharacterCode[ToCharacterCode[prvnipismeno]+2],"\[RightBracketingBar] = ",ToString[Round[delkastrany[[1]],0.01]]," j"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style["",15,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["o = ",ToString[Round[obvod,0.01]]," j"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["S = ",ToString[Round[obsah,0.01]]," (j^2)"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style["",15,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["\[LeftBracketingBar]∢ ",FromCharacterCode[ToCharacterCode[prvnipismeno]+1],FromCharacterCode[ToCharacterCode[prvnipismeno]],FromCharacterCode[ToCharacterCode[prvnipismeno]+2],"\[RightBracketingBar] = ",ToString[Round[uhel[[1]](180/π),0.01]],"°"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["\[LeftBracketingBar]∢ ",FromCharacterCode[ToCharacterCode[prvnipismeno]],FromCharacterCode[ToCharacterCode[prvnipismeno]+1],FromCharacterCode[ToCharacterCode[prvnipismeno]+2],"\[RightBracketingBar] = ",ToString[Round[uhel[[2]](180/π),0.01]],"°"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitmetrickevlastnosti,
Item[Style[StringJoin["\[LeftBracketingBar]∢ ",FromCharacterCode[ToCharacterCode[prvnipismeno]+1],FromCharacterCode[ToCharacterCode[prvnipismeno]+2],FromCharacterCode[ToCharacterCode[prvnipismeno]],"\[RightBracketingBar] = ",ToString[Round[uhel[[3]](180/π),0.01]],"°"],20,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[StringJoin@@Table[" ",{50}],20,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,
FrameLabel->{Style["© Jaroslav Reichl, 2009",10,Black,FontFamily->Times],"",Style["Trojúhelník",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.

ZobrazeniTrojuhelnika