Přímka v rovině a způsoby jejího zápisu

Následující aplet umožňuje lépe pochopit způsoby zapsání přímky v rovině, která je zadána bodem a vektorem, který bodem nemusí procházet (souřadnice bodu, počátečního bodu vektoru a koncového bodu vektoru se při spuštění volí náhodně).
Tažením myši (při stisknutém levém tlačítku myši) lze měnit počáteční i koncový bod "modrého" vektoru. Současně s ním se překreslují (jsou-li zobrazeny) směrový vektor přímky, směrový vektor posunutý do počátku kartézského systému souřadnic a normálový vektor a mění se tvar rovnic přímky (parametrická, obecná, směrnicová), je-li jejich zobrazení vybráno.
Pomocí posuvníků (Subscript[a, x]) a (Subscript[a, y]) lze měnit souřadnice bodu, kterým je přímka určena.
Bod, vektory a přímka jsou popsány náhodně zvolenými písmeny z předem nadefinované skupiny písmen. Pokud požaduje uživatel speciální nastavení názvu bodu, vektoru či přímky, lze toto nastavení provést v proměnných nazevbodu, nazevvektoru a nazevprimky.

V apletu lze volitelně zobrazit:
	osy kartézského systému;
	směrový vektor;
	vektor v nule - tj. směrový vektor posunutý do počátku kartézského systému souřadnic;
	normálový vektor - ten je zobrazen (ze dvou možných variant) vždy tak, že má kladnou x-ovou souřadnici;
	souřadnice - bodu a vektoru (resp. vektorů);
	parametrickou rovnici přímky;
	obecnou rovnici přímky;
	směrnicový tvar rovnice přímky.

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="anal_primka_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

nazevbodu=RandomChoice[{"A","B","C","D","E","F","G","H","J","K","L","M","Z"}];
nazevvektoru=RandomChoice[{"s","u","v","w"}];
nazevprimky=RandomChoice[{"p","q","r"}];
x1=-10;x2=-x1;
y1=-10;y2=-y1;
delta=0.02(x2-x1);

bodx0=RandomInteger[{(x1/2),(x2/2)}];bodxmin=x1;bodxmax=x2;deltabodx=0.1;
body0=RandomInteger[{(y1/2),(y2/2)}];bodymin=y1;bodymax=y2;deltabody=0.1;

tloustka=0.005;
velikostbodu=0.015;
velikostsipky=0.035;
velikostpisma=18;

barva=Black;
barvabodu=Magenta;
barvaprimky=Black;
barvavektoru=Blue;
barvavektoruvnule=Red;
barvasmerovehovektoru=Orange;
barvanormalovehovektoru=Darker[Green,0.4];
barvasouradnic=Black;

osax={
Arrowheads[{0,0.8velikostsipky}],
Arrow[{{x1,0.5(y1+y2)},{x2,0.5(y1+y2)}}]};
osay={
Arrowheads[{0,0.8velikostsipky}],
Arrow[{{0.5(x1+x2),y1},{0.5(x1+x2),y2}}]};

ZobrazeniPrimkyVe2D=Manipulate[Deploy[
(*Obecná rovnice přímky*)
If[vektor[[2,2]]-vektor[[1,2]]≥0,
{koefx=vektor[[2,2]]-vektor[[1,2]],
koefy=-(vektor[[2,1]]-vektor[[1,1]])},
{koefx=-(vektor[[2,2]]-vektor[[1,2]]),
koefy=vektor[[2,1]]-vektor[[1,1]]}];
obrce[x_,y_]:=koefx x+koefy y+absclen1;
reseni=Solve[obrce[bodx,body]==0,absclen1];
absclen=absclen1/.reseni[[1]];
obecnarce[x_,y_]:=obrce[x,y]/.absclen1->absclen;
(*Hledání sourařadnic, na které se má vypsat název přímky*)
reseni=Solve[obecnarce[x2,ypom]==0,ypom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=ypom/.reseni[[1]],
If[pomprusecik≥y1+2delta&&pomprusecik≤y2-2delta,
{souradnicenazvuprimkyx=x2-2delta,
souradnicenazvuprimkyy=pomprusecik-delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False];
If[OKprusecik==False,
{reseni=Solve[obecnarce[xpom,y2]==0,xpom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=xpom/.reseni[[1]],
If[pomprusecik≥x1+2delta&&pomprusecik≤x2-2delta,
{souradnicenazvuprimkyx=pomprusecik-delta,
souradnicenazvuprimkyy=y2-2delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False]},
""];
If[OKprusecik==False,
{reseni=Solve[obecnarce[xpom,y1]==0,xpom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=xpom/.reseni[[1]],
If[pomprusecik≥x1+2delta&&pomprusecik≤x2-2delta,
{souradnicenazvuprimkyx=pomprusecik-delta,
souradnicenazvuprimkyy=y1+2delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False]},
""];

vektor=PadRight[vektor,2,RandomReal[{0.5x1,0.5x2},{2,2}]];
vektorprokresleni={
Arrowheads[{0,velikostsipky}],
Arrow[{{vektor[[1,1]],vektor[[1,2]]},{vektor[[2,1]],vektor[[2,2]]}}]};
smerovyvektor={
Arrowheads[{0,velikostsipky}],
Arrow[{{bodx,body},{bodx+vektor[[2,1]]-vektor[[1,1]],body+vektor[[2,2]]-vektor[[1,2]]}}]};
vektorvnule={
Arrowheads[{0,velikostsipky}],
Arrow[{{0,0},{vektor[[2,1]]-vektor[[1,1]],vektor[[2,2]]-vektor[[1,2]]}}]};
normalovyvektor={
Arrowheads[{0,velikostsipky}],
Arrow[{{bodx,body},{bodx+koefx,body+koefy}}]};

If[zobrazitsouradnice,
{If[zobrazitsmerovyvektor==False,
If[zobrazitvektorvnule==False,
pissouradnice=StringJoin[ToString[Style[Overscript[nazevvektoru,"→"],barvavektoru,Italic],StandardForm],ToString[Style[" = (",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,1]]-vektor[[1,1]],0.1]],barvavektoru],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,2]]-vektor[[1,2]],0.1]],barvavektoru],StandardForm],ToString[Style[")",barva],StandardForm]],
pissouradnice=StringJoin[ToString[Style[Overscript[nazevvektoru,"→"],barvavektoru,Italic],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[Overscript[nazevvektoru,"→"],barvavektoruvnule,Italic],StandardForm],ToString[Style[" = (",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,1]]-vektor[[1,1]],0.1]],barvavektoruvnule],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,2]]-vektor[[1,2]],0.1]],barvavektoruvnule],StandardForm],ToString[Style[")",barva],StandardForm]]],
If[zobrazitvektorvnule==False,
pissouradnice=StringJoin[ToString[Style[Overscript[nazevvektoru,"→"],barvavektoru,Italic],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[Overscript[nazevvektoru,"→"],barvasmerovehovektoru,Italic],StandardForm],ToString[Style[" = (",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,1]]-vektor[[1,1]],0.1]],barvasmerovehovektoru],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,2]]-vektor[[1,2]],0.1]],barvasmerovehovektoru],StandardForm],ToString[Style[")",barva],StandardForm]],
pissouradnice=StringJoin[ToString[Style[Overscript[nazevvektoru,"→"],barvavektoru,Italic],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[Overscript[nazevvektoru,"→"],barvasmerovehovektoru,Italic],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[Overscript[nazevvektoru,"→"],barvavektoruvnule,Italic],StandardForm],ToString[Style[" = (",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,1]]-vektor[[1,1]],0.1]],barvasmerovehovektoru],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[vektor[[2,2]]-vektor[[1,2]],0.1]],barvasmerovehovektoru],StandardForm],ToString[Style[")",barva],StandardForm]]]],
If[zobrazitnormalovyvektor,
pissouradnicenormalovehovektoru=StringJoin[ToString[Style[Overscript["n","→"],barvanormalovehovektoru,Italic],StandardForm],ToString[Style[" = (",barva],StandardForm],ToString[Style[ToString[Round[koefx,0.1]],barvanormalovehovektoru],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[koefy,0.1]],barvanormalovehovektoru],StandardForm],ToString[Style[")",barva],StandardForm]],
""],
pissouradnicebodu=StringJoin[ToString[Style[nazevbodu,barvabodu],StandardForm],ToString[Style[" = [",barva],StandardForm],ToString[Style[ToString[Round[bodx,0.1]],barvabodu],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[body,0.1]],barvabodu],StandardForm],ToString[Style["]",barva],StandardForm]]},
""];
If[zobrazitparamrovniciprimky,
{If[vektor[[2,1]]-vektor[[1,1]]≥0,
znamenko=" + ",
znamenko=" - "],
pisrovniciprimky2=StringJoin[ToString[Style[nazevprimky,barvaprimky,Italic],StandardForm],ToString[Style[": x = ",barva],StandardForm],ToString[Style[ToString[Round[bodx,0.01]],barvabodu],StandardForm],ToString[Style[znamenko,barva],StandardForm],ToString[Style[ToString[Round[Abs[vektor[[2,1]]-vektor[[1,1]]],0.1]],barvasmerovehovektoru],StandardForm],ToString[Style["t",barva],StandardForm]],
If[vektor[[2,2]]-vektor[[1,2]]≥0,
znamenko=" + ",
znamenko=" - "],
pisrovniciprimky3=StringJoin[ToString[Style["    y = ",barva],StandardForm],ToString[Style[ToString[Round[body,0.01]],barvabodu],StandardForm],ToString[Style[znamenko,barva],StandardForm],ToString[Style[ToString[Round[Abs[vektor[[2,2]]-vektor[[1,2]]],0.1]],barvasmerovehovektoru],StandardForm],ToString[Style["t; t∈ℝ",barva],StandardForm]]},
""];

If[zobrazitobecnourovniciprimky,
{If[koefy≥0,
znamenko=" + ",
znamenko=" - "],
If[absclen≥0,
znamenko2=" + ",
znamenko2=" - "],
pisobecnourci=StringJoin[ToString[Style[nazevprimky,barvaprimky,Italic],StandardForm],ToString[Style[": ",barva],StandardForm],ToString[Style[ToString[Round[koefx,0.1]],barvasmerovehovektoru],StandardForm],ToString[Style["x",barva],StandardForm],ToString[Style[znamenko,barva],StandardForm],ToString[Style[ToString[Round[Abs[koefy],0.1]],barvasmerovehovektoru],StandardForm],ToString[Style["y",barva],StandardForm],ToString[Style[znamenko2,barva],StandardForm],ToString[Style[ToString[Round[Abs[absclen],0.1]],Darker[barvabodu]],StandardForm],ToString[Style[" = 0",barva],StandardForm]]},
""];
If[zobrazitsmernicovourovniciprimky,
If[Round[koefy,0.1]≠0,
{If[koefy>0,
znamenko="-",
znamenko=""],
If[absclen koefy≥0,
znamenko2=" + ",
znamenko2=" - "],
pissmernicovourci=StringJoin[ToString[Style[nazevprimky,barvaprimky,Italic],StandardForm],ToString[Style[": y = ",barva],StandardForm],ToString[Style[znamenko,barva],StandardForm],ToString[DisplayForm[FractionBox[ToString[Style[ToString[Round[koefx,0.1]],barvasmerovehovektoru],StandardForm],ToString[Style[ToString[Round[Abs[koefy],0.1]],barvasmerovehovektoru],StandardForm]]],StandardForm],ToString[Style["x",barva],StandardForm],ToString[Style[znamenko2,barva],StandardForm],ToString[DisplayForm[FractionBox[ToString[Style[ToString[Round[Abs[absclen],0.1]],Darker[barvabodu]],StandardForm],ToString[Style[ToString[Round[Abs[koefy],0.1]],barvasmerovehovektoru],StandardForm]]],StandardForm]]},
pissmernicovourci="Nelze zapsat!"],
""];

grafik=Show[
ParametricPlot[{bodx+t (vektor[[2,1]]-vektor[[1,1]]),body+t (vektor[[2,2]]-vektor[[1,2]])},{t,((x1-bodx)/(vektor[[2,1]]-vektor[[1,1]]+0.001)),((x2-bodx)/(vektor[[2,1]]-vektor[[1,1]]+0.001))},PlotStyle->{barvaprimky,Thickness[0.5tloustka]},Axes->False],
Graphics[{
If[zobrazitosy,
{{barva,Thickness[0.7tloustka],osax},
{barva,Thickness[0.7tloustka],osay},
Text[Style["x",15,barva,FontFamily->Times,Italic],{x2,0.5(x1+x2)},{Right,Top}],
Text[Style["y",15,barva,FontFamily->Times,Italic],{0.05x1,y2},{Center,Top}]},
Text[""]],
{barvavektoru,Thickness[tloustka],vektorprokresleni},
{barvabodu,PointSize[velikostbodu],Point[{bodx,body}]},
Text[Style[nazevbodu,20,barvabodu,FontFamily->Times,Bold],{bodx-delta,body+delta},{Center,Center}],
Text[Style[nazevprimky,20,barvaprimky,FontFamily->Times,Bold,Italic],{souradnicenazvuprimkyx,souradnicenazvuprimkyy},{Center,Center}],
If[zobrazitsmerovyvektor,
{{barvasmerovehovektoru,Thickness[tloustka],smerovyvektor},
Text[Style[Overscript[nazevvektoru,"→"],20,barvasmerovehovektoru,FontFamily->Times,Italic,Bold],{1.1(bodx+vektor[[2,1]]-vektor[[1,1]]),1.1(body+vektor[[2,2]]-vektor[[1,2]])},{Center,Center}]},
Text[""]],
If[zobrazitnormalovyvektor,
{{barvanormalovehovektoru,Thickness[tloustka],normalovyvektor},
Text[Style[Overscript["n","→"],20,barvanormalovehovektoru,FontFamily->Times,Italic,Bold],{1.1(bodx+koefx),1.1(body+koefy)},{Center,Center}]},
Text[""]],
If[zobrazitvektorvnule,
{{barvavektoruvnule,Thickness[tloustka],vektorvnule},
Text[Style[Overscript[nazevvektoru,"→"],20,barvavektoruvnule,FontFamily->Times,Italic,Bold],{1.1(vektor[[2,1]]-vektor[[1,1]]),1.1(vektor[[2,2]]-vektor[[1,2]])},{Center,Center}]},
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->490
]],

{{vektor,RandomReal[{0.8x1,0.8x2},{2,2}]},Locator,Appearance->""},
{{bodx,bodx0,Style[Subscript[FromCharacterCode[ToCharacterCode[nazevbodu]+32],"x"],15,barvabodu]},bodxmin,bodxmax,deltabodx},
{{body,body0,Style[Subscript[FromCharacterCode[ToCharacterCode[nazevbodu]+32],"y"],15,barvabodu]},bodymin,bodymax,deltabody},
Delimiter,
Item[Style["Zobrazit",20,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitosy,True,Style["- osy",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitsmerovyvektor,True,Style["- směrový vektor",15,barvasmerovehovektoru,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvektorvnule,False,Style["- vektor v nule",15,barvavektoruvnule,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitnormalovyvektor,False,Style["- normálový vektor",15,barvanormalovehovektoru,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitsouradnice,False,Style["- souřadnice",15,barvasouradnic,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Item[Style["Zobrazit rovnici",20,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitparamrovniciprimky,False,Style["- parametrickou",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitobecnourovniciprimky,False,Style["- obecnou",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitsmernicovourovniciprimky,False,Style["- směrnicovou",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,

Dynamic[
Grid[{
{If[zobrazitsouradnice&&zobrazitosy,
Item[Style[pissouradnice,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsouradnice&&zobrazitosy,
Item[Style[pissouradnicebodu,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsouradnice&&zobrazitosy&&zobrazitnormalovyvektor,
Item[Style[pissouradnicenormalovehovektoru,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitparamrovniciprimky&&zobrazitsouradnice,
Item[Style[StringJoin@@Table["-",{20}],velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",0.5velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[zobrazitparamrovniciprimky,
Item[Style[pisrovniciprimky2,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitparamrovniciprimky,
Item[Style[pisrovniciprimky3,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",0.5velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[zobrazitobecnourovniciprimky,
Item[Style[pisobecnourci,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",0.5velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[zobrazitsmernicovourovniciprimky,
Item[Style[pissmernicovourci,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,
FrameLabel->{Style["© Jaroslav Reichl, 2009",10,Black,FontFamily->Times],"",Style["Přímka v rovině a způsoby jejího zápisu",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.

ZobrazeniPrimkyVe2D