Vzájemná poloha dvou přímek v rovině - přímky dány obecně

Tento interaktivní notebook umožňuje znázornit vzájemnou polohu dvou přímek v rovině. Přímky jsou dány obecně normálovým vektorem, který je k dané přímkce kolmý, a koeficientem c z obecné rovnice přímky a x + b y + c = 0.
Pomocí posuvníků lze nastavit koeficienty c obou přímek a pomocí levého tlačítka myši lze změnit polohu a směr příslušného vektoru: stačí stisknout levé tlačítko myši v blízkosti zvoleného krajního bodu vektoru a pohybovat myší. Jakmile bude mít vektor požadovanou polohu, tlačítko pustíme.
Volitelně lze v notebooku zobrazit:
	popis bodů, vektorů a přímek;
	souřadnice bodů a vektorů;
	rovnice přímek;
	vzájemnou polohu daných přímek.

Názvy bodů, vektorů a přímek se volí při spuštění notebooku náhodně. Pokud je chce uživatel změnit, jsou tyto názvy uloženy v proměnných nazevbodu1, nazevbodu2, nazevpruseciku, nazevprimky1, nazevprimky2, nazevvektoru1 a nazevvektoru2.

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


x1=-10;x2=-x1;
y1=-10;y2=-y1;
stredx=((x1+x2)/2);stredy=((y1+y2)/2);
delta=0.02(x2-x1);(*Použito u popisu bodů, vektorů a přímek.*)

nazevbodu1=RandomChoice[{"A","B","C","D","E","F","G","I","H","J","K","L"}];
nazevbodu2=FromCharacterCode[ToCharacterCode[nazevbodu1]+1];
nazevpruseciku=RandomChoice[{"P","P","Q","Q","R"}];
nazevprimky1=RandomChoice[{"p","q"}];
nazevprimky2=FromCharacterCode[ToCharacterCode[nazevprimky1]+1];
nazevvektoru=RandomChoice[{"s","u","v","w"}];
nazevvektoru1=ToString[Overscript[Subscript[nazevvektoru,nazevprimky1],"⟶"],StandardForm];
nazevvektoru2=ToString[Overscript[Subscript[nazevvektoru,nazevprimky2],"⟶"],StandardForm];

bod110=RandomInteger[{x1+1,x2-1}];bod120=RandomInteger[{y1+1,y2-1}];
bod210=RandomInteger[{x1+1,x2-1}];bod220=RandomInteger[{y1+1,y2-1}];
bod1min=x1;bod1max=x2;deltabod1=0.025(x2-x1);
posun10=RandomInteger[{y1+1,y2-1}];posun20=RandomInteger[{y1+1,y2-1}];
posunmin=y1;posunmax=y2;deltaposun=0.025(x2-x1);

tloustka=0.005;
velikostbodu=0.015;
sipka=0.04;
velikostpisma=15;

barva=Black;
barvaprimka1=Blue;
barvaprimka2=Red;
barvaprusecik=Magenta;

osax={
Arrowheads[{0,0.5sipka}],
Arrow[{{x1,stredy},{x2,stredy}}]};
osay={
Arrowheads[{0,0.5sipka}],
Arrow[{{stredx,y1},{stredx,y2}}]};

VzajemnaPolohaPrimek2=Manipulate[Deploy[
pomvektor=PadRight[pomvektor,4,RandomReal[{0.5x1,0.5x2},{4,2}]];
normvektor1=Table[Round[pomvektor[[i]],0.5],{i,1,2,1}];
normvektor2=Table[Round[pomvektor[[i]],0.5],{i,3,4,1}];
kreslivektor1={
Arrowheads[{0,sipka}],
Arrow[{{normvektor1[[1,1]],normvektor1[[1,2]]},{normvektor1[[2,1]],normvektor1[[2,2]]}}]};
kreslivektor2={
Arrowheads[{0,sipka}],
Arrow[{{normvektor2[[1,1]],normvektor2[[1,2]]},{normvektor2[[2,1]],normvektor2[[2,2]]}}]};

(*Obecné rovnice přímek*)
obecnarce1[x_,y_]:=(normvektor1[[2,1]]-normvektor1[[1,1]]) x+(normvektor1[[2,2]]-normvektor1[[1,2]]) y+posun1;
obecnarce2[x_,y_]:=(normvektor2[[2,1]]-normvektor2[[1,1]]) x+(normvektor2[[2,2]]-normvektor2[[1,2]])y+posun2;

(*Hledání sourařadnic, na které se má vypsat název první přímky*)
reseni=Solve[obecnarce1[x2,ypom]==0,ypom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=ypom/.reseni[[1]],
If[pomprusecik≥y1+2delta&&pomprusecik≤y2-2delta,
{souradnicenazvuprimky1x=x2-2delta,
souradnicenazvuprimky1y=pomprusecik-delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False];
If[OKprusecik==False,
{reseni=Solve[obecnarce1[xpom,y2]==0,xpom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=xpom/.reseni[[1]],
If[pomprusecik≥x1+2delta&&pomprusecik≤x2-2delta,
{souradnicenazvuprimky1x=pomprusecik-delta,
souradnicenazvuprimky1y=y2-2delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False]},
""];
If[OKprusecik==False,
{reseni=Solve[obecnarce1[xpom,y1]==0,xpom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=xpom/.reseni[[1]],
If[pomprusecik≥x1+2delta&&pomprusecik≤x2-2delta,
{souradnicenazvuprimky1x=pomprusecik-delta,
souradnicenazvuprimky1y=y1+2delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False]},
""];
(*Hledání sourařadnic, na které se má vypsat název druhé přímky*)
reseni=Solve[obecnarce2[x2,ypom]==0,ypom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=ypom/.reseni[[1]],
If[pomprusecik≥y1+2delta&&pomprusecik≤y2-2delta,
{souradnicenazvuprimky2x=x2-2delta,
souradnicenazvuprimky2y=pomprusecik-delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False];
If[OKprusecik==False,
{reseni=Solve[obecnarce2[xpom,y2]==0,xpom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=xpom/.reseni[[1]],
If[pomprusecik≥x1+2delta&&pomprusecik≤x2-2delta,
{souradnicenazvuprimky2x=pomprusecik-delta,
souradnicenazvuprimky2y=y2-2delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False]},
""];
If[OKprusecik==False,
{reseni=Solve[obecnarce2[xpom,y1]==0,xpom];
If[reseni≠{}∧reseni≠{{}},
{pomprusecik=xpom/.reseni[[1]],
If[pomprusecik≥x1+2delta&&pomprusecik≤x2-2delta,
{souradnicenazvuprimky2x=pomprusecik-delta,
souradnicenazvuprimky2y=y1+2delta,
OKprusecik=True},
OKprusecik=False]},
OKprusecik=False]},
""];

(*Hledání průsečíku daných přímek*)
reseni=Quiet[Solve[{obecnarce1[xpom,ypom]==0,obecnarce2[xpom,ypom]==0},{xpom,ypom}]];
If[reseni≠{},
{prusecikx=xpom/.reseni[[1,1]],
If[NumericQ[prusecikx],
{pruseciky=ypom/.reseni[[1,2]],
If[{normvektor1[[2,1]]-normvektor1[[1,1]],normvektor1[[2,2]]-normvektor1[[1,2]]}.{normvektor2[[2,1]]-normvektor2[[1,1]],normvektor2[[2,2]]-normvektor2[[1,2]]}==0,
poloha=11,(*Přímky jsou kolmé.*)
poloha=1(*Přímky jsou různoběžné.*)]},
poloha=2(*Přímky spývají.*)]},
poloha=3(*Přímky jsou rovnoběžné různé.*)];
(*Hledání průsečíku daných přímek*)

(*Příprava výpisu souřadnic, ...*)
pissouradnicenormvektoru1=StringJoin[ToString[Style[ToString[Overscript[Subscript["n",nazevprimky1],"⟶"],StandardForm],barvaprimka1,Italic],StandardForm],ToString[Style[" = (",barva],StandardForm],ToString[Style[ToString[Round[normvektor1[[2,1]]-normvektor1[[1,1]],0.1]],barvaprimka1],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[normvektor1[[2,2]]-normvektor1[[1,2]],0.1]],barvaprimka1],StandardForm],ToString[Style[")",barva],StandardForm]];
pissouradnicenormvektoru2=StringJoin[ToString[Style[ToString[Overscript[Subscript["n",nazevprimky2],"⟶"],StandardForm],barvaprimka2,Italic],StandardForm],ToString[Style[" = (",barva],StandardForm],ToString[Style[ToString[Round[normvektor2[[2,1]]-normvektor2[[1,1]],0.1]],barvaprimka2],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[normvektor2[[2,2]]-normvektor2[[1,2]],0.1]],barvaprimka2],StandardForm],ToString[Style[")",barva],StandardForm]];
If[normvektor1[[2,2]]-normvektor1[[1,2]]≥0,
znamenko1=" + ",
znamenko1=" - "];
If[posun1≥0,
znamenko2=" + ",
znamenko2=" - "];
pisrovniciprimky1=StringJoin[ToString[Style[nazevprimky1,barvaprimka1,Italic],StandardForm],ToString[Style[": ",barva],StandardForm],ToString[Style[ToString[Round[normvektor1[[2,1]]-normvektor1[[1,1]],0.1]],barvaprimka1],StandardForm],ToString[Style["x",barva],StandardForm],ToString[Style[znamenko1,barva],StandardForm],ToString[Style[ToString[Round[Abs[normvektor1[[2,2]]-normvektor1[[1,2]]],0.1]],barvaprimka1],StandardForm],ToString[Style["y",barva],StandardForm],ToString[Style[znamenko2,barva],StandardForm],ToString[Style[ToString[Round[Abs[posun1],0.1]],barvaprimka1],StandardForm],ToString[Style[" = 0",barva],StandardForm]];
If[normvektor2[[2,2]]-normvektor2[[1,2]]≥0,
znamenko1=" + ",
znamenko1=" - "];
If[posun2≥0,
znamenko2=" + ",
znamenko2=" - "];
pisrovniciprimky2=StringJoin[ToString[Style[nazevprimky2,barvaprimka2,Italic],StandardForm],ToString[Style[": ",barva],StandardForm],ToString[Style[ToString[Round[normvektor2[[2,1]]-normvektor2[[1,1]],0.1]],barvaprimka2],StandardForm],ToString[Style["x",barva],StandardForm],ToString[Style[znamenko1,barva],StandardForm],ToString[Style[ToString[Round[Abs[normvektor2[[2,2]]-normvektor2[[1,2]]],0.1]],barvaprimka2],StandardForm],ToString[Style["y",barva],StandardForm],ToString[Style[znamenko2,barva],StandardForm],ToString[Style[ToString[Round[Abs[posun2],0.1]],barvaprimka2],StandardForm],ToString[Style[" = 0",barva],StandardForm]];
If[poloha==1∨poloha==11,
pissouradnicepruseciku=StringJoin[ToString[Style[nazevpruseciku,barvaprusecik,Italic],StandardForm],ToString[Style[" = [",barva],StandardForm],ToString[Style[ToString[Round[prusecikx,0.1]],barvaprusecik],StandardForm],ToString[Style["; ",barva],StandardForm],ToString[Style[ToString[Round[pruseciky,0.1]],barvaprusecik],StandardForm],ToString[Style["]",barva],StandardForm]],
""];
If[poloha==1,
pispolohu=StringJoin[ToString[Style["Přímky ",barva],StandardForm],ToString[Style[nazevprimky1,barvaprimka1,Italic],StandardForm],ToString[Style[" a ",barva],StandardForm],ToString[Style[nazevprimky2,barvaprimka2,Italic],StandardForm],ToString[Style[" jsou různoběžné.",barva],StandardForm]],
If[poloha==11,
pispolohu=StringJoin[ToString[Style["Přímky ",barva],StandardForm],ToString[Style[nazevprimky1,barvaprimka1,Italic],StandardForm],ToString[Style[" a ",barva],StandardForm],ToString[Style[nazevprimky2,barvaprimka2,Italic],StandardForm],ToString[Style[" jsou různoběžné kolmé.",barva],StandardForm]],
If[poloha==2,
pispolohu=StringJoin[ToString[Style["Přímky ",barva],StandardForm],ToString[Style[nazevprimky1,barvaprimka1,Italic],StandardForm],ToString[Style[" a ",barva],StandardForm],ToString[Style[nazevprimky2,barvaprimka2,Italic],StandardForm],ToString[Style[" splývají.",barva],StandardForm]],
pispolohu=StringJoin[ToString[Style["Přímky ",barva],StandardForm],ToString[Style[nazevprimky1,barvaprimka1,Italic],StandardForm],ToString[Style[" a ",barva],StandardForm],ToString[Style[nazevprimky2,barvaprimka2,Italic],StandardForm],ToString[Style[" jsou rovnoběžné různé.",barva],StandardForm]]]]];

grafik=Show[
ContourPlot[{obecnarce1[x,y]==0,obecnarce2[x,y]==0},{x,x1,x2},{y,y1,y2},ContourStyle->{{barvaprimka1,Thickness[0.7tloustka]},{barvaprimka2,Thickness[0.7tloustka]}},Axes->False,Frame->False],
Graphics[{
{barva,Thickness[0.5tloustka],osax},
{barva,Thickness[0.5tloustka],osay},
Text[Style["x",15,barva,FontFamily->Times,Italic],{x2,stredx},{Right,Top}],
Text[Style["y",15,barva,FontFamily->Times,Italic],{0.05x1,y2},{Center,Top}],
{barvaprimka1,Thickness[tloustka],Dashed,kreslivektor1},
{barvaprimka2,Thickness[tloustka],Dashed,kreslivektor2},
If[poloha==1∨poloha==11,
{barvaprusecik,PointSize[velikostbodu],Point[{prusecikx,pruseciky}]},
Text[""]],
If[zobrazitpopis,
{Text[Style[ToString[Overscript[Subscript["n",nazevprimky1],"⟶"],StandardForm],15,barvaprimka1,FontFamily->Times,Bold],{normvektor1[[2,1]]+delta,normvektor1[[2,2]]+delta},{Center,Bottom}],
Text[Style[ToString[Overscript[Subscript["n",nazevprimky2],"⟶"],StandardForm],15,barvaprimka2,FontFamily->Times,Bold],{normvektor2[[2,1]]+delta,normvektor2[[2,2]]+delta},{Center,Bottom}],
Text[Style[nazevprimky1,20,barvaprimka1,FontFamily->Times,Bold,Italic],{souradnicenazvuprimky1x,souradnicenazvuprimky1y},{Center,Center}],
Text[Style[nazevprimky2,20,barvaprimka2,FontFamily->Times,Bold,Italic],{souradnicenazvuprimky2x,souradnicenazvuprimky2y},{Center,Center}],
If[poloha==1∨poloha==11,
Text[Style[nazevpruseciku,15,barvaprusecik,FontFamily->Times,Bold],{prusecikx,pruseciky-delta},{Center,Top}],
Text[""]]},
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

{{pomvektor,{{0,0}}},Locator,Appearance->""},
{{posun1,posun10,Style[Subscript["c",nazevprimky1],15,barvaprimka1]},posunmin,posunmax,deltaposun},
{{posun2,posun20,Style[Subscript["c",nazevprimky2],15,barvaprimka2]},posunmin,posunmax,deltaposun},
Delimiter,
Item[Style["Zobrazit",20,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitpopis,True,Style["- popis",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitsouradnice,True,Style["- souřadnice",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitrovniceprimek,True,Style["- rovnice přímek",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitpolohu,True,Style["- polohu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Dynamic[
Grid[{
{If[zobrazitsouradnice&&zobrazitpopis,
Item[Style[pissouradnicenormvektoru1,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsouradnice&&zobrazitpopis,
Item[Style[pissouradnicenormvektoru2,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",0.4velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[zobrazitpopis&&zobrazitrovniceprimek,
Item[Style[pisrovniciprimky1,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",0.4velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[zobrazitpopis&&zobrazitrovniceprimek,
Item[Style[pisrovniciprimky2,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",0.4velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[zobrazitpopis&&zobrazitpolohu,
Item[Style[pispolohu,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsouradnice&&zobrazitpopis&&zobrazitpolohu&&(poloha==1∨poloha==11),
Item[Style[pissouradnicepruseciku,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["Vzájemná poloha dvou přímek v rovině - přímky dány obecně",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.

VzajemnaPolohaPrimek2