Kružnice: tečna v průsečíku přímky s kružnicí

Tento notebook vypíše a vykreslí rovnici tečny, která je sestrojená k zadané kružnici a která se kružnice dotýká v jejích průsečících se zadanou přímkou.
Kružnice je určena koeficienty:
	m - x-ová souřadnice středu kružnice;
	n - y-ová souřadnice středu kružnice;
	r - poloměr.
Přímka je určena koeficienty a, b a c, které vystupují v její obecné rovnici.

© Jaroslav Reichl, 2010

(*Parametry kružnice*)
m=0;
n=0;
r=10;

(*Parametry přímky*)
a=2;
b=-1;
c=10;

primka=a x+b y+c==0;
kruznice=(((x-m))^2)+(((y-n))^2)-(r^2);

xmin=-21;
xmax=15;
ymin=-15;
ymax=15;
deltavypis=0.025(xmax-xmin);

barva=Black;
barvakce=Blue;
barvatecny=Orange;
barvaprimky=Red;

tloustka=0.005;
velikostbodu=0.015;

kruznicerce=kruznice==0;
reseni=Solve[{kruznicerce,primka},{x,y}];
prusecik1x=x/.reseni[[1,1]];
prusecik1y=y/.reseni[[1,2]];
prusecik2x=x/.reseni[[2,1]];
prusecik2y=y/.reseni[[2,2]];
If[Im[prusecik1x]==0,
chyba=False,
chyba=True];
If[chyba==False,
{rcetecny1=(prusecik1x-m)(x-m)+(prusecik1y-n)(y-n)-(r^2)==0,
rcetecny2=(prusecik2x-m)(x-m)+(prusecik2y-n)(y-n)-(r^2)==0,
resenitecna1=Solve[rcetecny1,y],
resenitecna2=Solve[rcetecny2,y],
tecna1kresleni[x_]:=y/.resenitecna1[[1]],
tecna2kresleni[x_]:=y/.resenitecna2[[1]]},
""];
reseniy=Solve[primka,y];
primkakresleni[x_]:=y/.reseniy[[1]];
kruznicekresleni[x_,y_]:=kruznice;

graf1=Plot[primkakresleni[x],{x,xmin,xmax},PlotStyle->{barvaprimky,Thickness[tloustka]}];
graf2=ContourPlot[kruznicekresleni[x,y]==0,{x,xmin,xmax},{y,ymin,ymax},ContourStyle->{barvakce,Thickness[tloustka]},Frame->False];
If[chyba==False,
graf3=Plot[{tecna1kresleni[x],tecna2kresleni[x]},{x,xmin,xmax},PlotStyle->{{barvatecny,Thickness[tloustka]},{barvatecny,Thickness[tloustka]}}],
graf3=Plot[0,{x,0,0.001},PlotStyle->{barva,Thickness[0.0001tloustka]}]];
Show[
graf1,
graf2,
graf3,
Graphics[{
{barvakce,PointSize[velikostbodu],Point[{m,n}]},
Text[Style["S",15,barvakce,FontFamily->Times],{m+deltavypis,n+deltavypis},{Center,Center}],
If[chyba==False,
{Text[Style["(Subscript[t, 1])",18,barvatecny,FontFamily->Times],{prusecik1x+3deltavypis,prusecik1y+deltavypis},{Center,Center}],
Text[Style["(Subscript[t, 2])",18,barvatecny,FontFamily->Times],{prusecik2x+3deltavypis,prusecik2y+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 [",prusecik1x,"; ",prusecik1y,"] a má rovnici y = ",TraditionalForm[Simplify[tecna1kresleni[x]]],"."],
Print["Tečna (Subscript[t, 2]) prochází bodem o souřadnicích [",prusecik2x,"; ",prusecik2y,"] a má rovnici y = ",TraditionalForm[Simplify[tecna2kresleni[x]]],"."]},
Print["Úloha nemá řešení!"]]