Elipsa: tečna se zadanou směrnicí

Tento notebook vypíše a vykreslí rovnici tečny, která je sestrojená k zadané elipse a která má zadanou směrnici.
Elipsa je určena koeficienty:
	m - x-ová souřadnice středu elipsy;
	n - y-ová souřadnice středu elipsy;
	a - délka hlavní poloosy elipsy;
	b - délka vedlejší poloosy elipsy.
Tečna je určena směrnicí, která je uložená v proměnné smerniceprimky.

© Jaroslav Reichl, 2010

(*Parametry elipsy*)
m=3;
n=-1;
a=4;
b=3;

(*Směrnice tečny, jejíž rovnice se mají nalézt*)
smerniceprimky=1;

elipsa=((((x-m))^2)/(a^2))+((((y-n))^2)/(b^2))-1;
tecnaelipsy=(((x-m)(x0-m))/(a^2))+(((y-n)(y0-n))/(b^2))-1;

xmin=-4;
xmax=8;
ymin=-5;
ymax=5;
deltavypis=0.03(xmax-xmin);

barva=Black;
barvaelipsy=Blue;
barvatecny=Red;

tloustka=0.005;
velikostbodu=0.02;

reseni=Solve[tecnaelipsy==0,y];
tecnaelipsyrce=y/.reseni[[1]];
smernicetecny=D[tecnaelipsyrce,x];
elipsarce=0==elipsa/.{x->x0,y->y0};

resenibod=Solve[{elipsarce,smernicetecny==smerniceprimky},{x0,y0}];
If[resenibod≠{},
{boddotyku1x=x0/.resenibod[[1,1]],
If[Im[boddotyku1x]==0,
{boddotyku1y=y0/.resenibod[[1,2]],
boddotyku2x=x0/.resenibod[[2,1]],
boddotyku2y=y0/.resenibod[[2,2]],
chyba=False},
chyba=True]},
chyba=True];

If[chyba==False,
{tecnaelipsykresleni1[x_]:=tecnaelipsyrce/.{x0->boddotyku1x,y0->boddotyku1y},
tecnaelipsykresleni2[x_]:=tecnaelipsyrce/.{x0->boddotyku2x,y0->boddotyku2y},
graftecna=Plot[{tecnaelipsykresleni1[x],tecnaelipsykresleni2[x]},{x,xmin,xmax},PlotStyle->{{barvatecny,Thickness[tloustka]},{barvatecny,Thickness[tloustka]}}]},
graftecna=Plot[0,{x,0,0.001},{y,0,0.001},PlotStyle->{barva,Thickness[0.0001tloustka]}]];
elipsakresleni[x_,y_]:=elipsa;
grafelipsa=ContourPlot[elipsakresleni[x,y]==0,{x,xmin,xmax},{y,ymin,ymax},ContourStyle->{barvaelipsy,Thickness[tloustka]},Frame->False];

Show[
grafelipsa,
graftecna,
(*Table[Plot[smerniceprimky x+i,{x,xmin,xmax},PlotStyle->{barvatecny,Dashed,Thickness[0.1tloustka]}],{i,-9,5,2}],*)
Graphics[{
{barvaelipsy,PointSize[velikostbodu],Point[{m,n}]},
Text[Style["S",15,barvaelipsy,FontFamily->Times],{m+deltavypis,n},{Center,Center}],
If[chyba==False,
{Text[Style["(Subscript[t, 1])",18,barvatecny,FontFamily->Times],{boddotyku1x+3deltavypis,boddotyku1y+deltavypis},{Center,Center}],
Text[Style["(Subscript[t, 2])",18,barvatecny,FontFamily->Times],{boddotyku2x+3deltavypis,boddotyku2y+deltavypis},{Center,Center}]},
Text[""]]}],
Axes->True,AxesLabel->{Style["x",barva,15,FontFamily->Times],Style["y",barva,15,FontFamily->Times]},PlotRange->{{xmin,xmax},{ymin,ymax}},AspectRatio->Automatic,ImageSize->700]

If[chyba==False,
{Print["Tečna (Subscript[t, 1]) prochází bodem o souřadnicích [",boddotyku1x,"; ",boddotyku1y,"] a má rovnici y = ",TraditionalForm[Simplify[tecnaelipsykresleni1[x]]],"."],
Print["Tečna (Subscript[t, 2]) prochází bodem o souřadnicích [",boddotyku2x,"; ",boddotyku2y,"] a má rovnici y = ",TraditionalForm[Simplify[tecnaelipsykresleni2[x]]],"."]},
Print["Úloha nemá řešení!"]]