Vaje: ravninska geometrija

2022-10-21

Konstrukcije s predavanj

Definirajmo nekatere osnovne konstrukcije in pomožne funkcije

Pomožne funkcije

Točke v ravnini lahko obravnavamo tudi kot vektorje, zato definiramo seštevanje in odštevanje točk. Dodamo še pravilo, ki pove, da sta točki enaki, če imata enake koordinate:

ClearAll[tocka]
tocka/:(tocka[x_,y_]==tocka[u_,v_]):=(x==u&&y==v)
tocka/:(tocka[x_,y_]+tocka[u_,v_]):=tocka[x+u,y+v]
tocka/:(tocka[x_,y_]-tocka[u_,v_]):=tocka[x-u,y-v]

Zgornji zapis tocka /: pove, da naj Mathematica prepisovalna pravila shrani v definiciji simbola tocka in ne v definiciji simbolov ==, + in -.

?tocka

Normirani vektor:

ClearAll[normirana]
normirana[tocka[x_,y_]]:=tocka[(x/(Sqrt[(x^2)+(y^2)])),(y/(Sqrt[(x^2)+(y^2)]))]

Konstrukcije

Premica določena z dvema točkama

Enačba premice, ki poteka skozi točki (u,v)in (s,t):

Solve[{a u + b v == c, a s + b t ==c},{a,b}]

Če vzamemo c=t u -s v, se imenovalci pokrajšajo in dobimo enačbo premice

(t-v)x+(u-s)y==t u-s v.

Še en način: ploščina paralelograma, ki ga razpenjata dani točki in splošna točka (x,y) na premici, je enaka nič:

Collect[Det[(({{s-u, x-u}, {t-v, y-v}}))],{x,y}]==0

Napišimo funkcijo, ki izračuna premico skozi dani točki:

ClearAll[premica]
premica[tocka[u_,v_], tocka[s_, t_]]:= premica[t-v, u-s,t*u-s*v]

Napišimo še funkcijo, ki vrne nosilko daljice:

nosilka[daljica[p_,q_]]:=premica[p,q]

Primer:

premica[tocka[1,1],tocka[-1,0]]

Presečišče premic

Presečišče premic a x + b y == c in d x + e y == f:

Solve[{a x+b y==c,d x + e y==f},{x,y}]//Simplify

Napišimo funkcijo, ki izračuna presečišče premic:

tocka[premica[a_,b_,c_],premica[d_,e_,f_]]:=tocka[((c*e-b*f)/(a*e-b*d)), ((a*f-c*d)/(a*e-b*d))]

Primer:

tocka[premica[1,-1,-1],premica[2,3,0]]

Pravokotnica na premico skozi dano točko

Enačba pravokotnice na premico a x+b y==c skozi točko (u,v) je

-b x+a y==-b u+a v.

ClearAll[pravokotnica]
pravokotnica[premica[a_,b_,_],tocka[u_,v_]]:= premica[-b,a,-b*u+a*v]

Primer:

pravokotnica[premica[0,1,0], tocka[0,0]]

Vzporednica k premici skozi dano točko

ClearAll[vzporednica]
vzporednica[premica[a_,b_,_], tocka[u_,v_]]:= premica[a,b,a*u+b*v]

Primer:

vzporednica[premica[1,2,7],tocka[-2,3]]

Manipulate[
Show[slika[{
premica[a,b],
Red,
vzporednica[premica[a,b],c]
}/.
{a->tocka[u[[1]],u[[2]]],b->tocka[v[[1]],v[[2]]],c->tocka[w[[1]],w[[2]]]}
],
PlotRange->{{-2,9},{-5,6}}],
{{u,{0,0}},Locator},
{{v,{7,0}},Locator},
{{w,{3,4}},Locator}]

Razpolovišče in simetrala daljice

ClearAll[razpolovisce]
razpolovisce[tocka[u_,v_],tocka[s_,t_]]:=tocka[(u+s)/2,(v+t)/2]

razpolovisce[daljica[p_tocka,q_tocka]]:=razpolovisce[p,q]

ClearAll[simetrala]
simetrala[d_daljica]:=pravokotnica[nosilka[d],razpolovisce[d]]
simetrala[p_tocka,q_tocka]:=simetrala[daljica[p,q]]

Primer:

simetrala[daljica[tocka[0,0],tocka[2,1]]]

Pravokotnost premic

Napišimo predikat pravokotniQ[p,q], ki vrne True, če sta premici p in q pravokotni:

pravokotniQ[premica[a_,b_,_],premica[d_,e_,_]]:=(a*d+b*e==0)

Primer:

pravokotniQ[premica[0,1,0], premica[1,0,0]]

pravokotniQ[premica[1,1,0],premica[-1,-1,0]]

Vzporednost premic

vzporedniQ[premica[a_,b_,_], premica[d_,e_,_]]:= (a*e-b*d==0)

Primer:

vzporedniQ[premica[1,2,0],premica[-3,-6,10]]

Pripadnost točke premici

Predikat pripadaQ[t,p] vrne True, če točka t leži na premici p.

pripadaQ[tocka[u_,v_],premica[a_,b_,c_]]:=(a*u+b*v==c)

Primer:

pripadaQ[tocka[10,11],premica[-1,1,2]]

Kolinearnost točk

ClearAll[kolinearneQ]
kolinearneQ[p_tocka,q_tocka,r_tocka]:=pripadaQ[p, premica[q,r]]

Če v funkcijo kolinearneQ vstavimo splošne koordinate, dobimo enačbo, ki izraža dejstvo, da so tri točke kolinearne:

kolinearneQ[tocka[(Subscript[x, 1]),(Subscript[y, 1])],tocka[(Subscript[x, 2]),(Subscript[y, 2])],tocka[(Subscript[x, 3]),(Subscript[y, 3])]]//Simplify

Konkurentnost premic

Pravimo, da so premice p, q in r konkurente, če se sekajo v skupni točki.

Napišimo predikat konkurentneQ[p,q,r], ki vrne True,  če so dane premice konkurentne:

ClearAll[konkurentneQ]
konkurentneQ[p_premica,q_premica,r_premica]:=pripadaQ[tocka[p,q], r]

Poglejmo, kakšno formulo dobimo v splošnem:

konkurentneQ[
premica[(Subscript[a, 1]),(Subscript[b, 1]),(Subscript[c, 1])],
 premica[(Subscript[a, 2]),(Subscript[b, 2]),(Subscript[c, 2])], premica[(Subscript[a, 3]),(Subscript[b, 3]),(Subscript[c, 3])]]//Simplify

Razdalja med točkama

Funkcija razdalja2[p,q] izračuna kvadrat razdalje med točkama p in q.

razdalja2[tocka[u_,v_],tocka[s_,t_]]:=(((u-s))^2)+(((v-t))^2)

Funkcija razdalja[p,q] izračuna razdaljo med točkama p in q.

razdalja[p_tocka,q_tocka]:=Sqrt[razdalja2[p,q]]

Kadar dokazujemo, da sta razdalji (Subscript[d, 1]) in (Subscript[d, 2]) enaki, je običajno lažje dokazati, da sta enaka njuna kvadrata. Zato bo pri dokazovanju izrekov prav prišla predvsem funkcija razdalja2.

Razdalja med točko in premico

razdalja2[tocka[x_,y_],premica[a_,b_,c_]]:=((((a*x+b*y-c))^2)/((a^2)+(b^2)))

razdalja[t_tocka, p_premica]:=(Sqrt[razdalja2[t,p]])

Primer:

razdalja[tocka[1,1],premica[1,1,0]]

Pravokotna projekcija točke na premico

Solve[{pripadaQ[tocka[u,v],premica[a,b,c]], pravokotniQ[premica[a,b,c],premica[tocka[x,y],tocka[u,v]]]},{u,v}]//Simplify

projekcija[tocka[x_,y_],premica[a_,b_,c_]]:=tocka[((a c+(b^2) x-a b y)/((a^2)+(b^2))),((b c-a b x+(a^2) y)/((a^2)+(b^2)))]

Grafični prikaz

Napišimo funkcijo slika[lst], ki sprejme seznam geometrijskih objektov tocka,  daljica, premica, kot in kroznica ter grafične ukaze. Funkcija vrne seznam grafičnih ukazov, ki narišejo dane geometrijske objekte.

narisi[tocka[u_,v_]]:={AbsolutePointSize[6],Point[{u,v}]}

narisi[daljica[tocka[u_,v_],tocka[s_,t_]]]:=Line[{{u,v},{s,t}}]

narisi[premica[a_, b_,c_]]/;b==0:=InfiniteLine[{{c/a,-1},{c/a,1}}]
narisi[premica[a_,b_,c_]]:=InfiniteLine[{{-1,(c+a)/b},{1,(c-a)/b}}]

narisi[kroznica[tocka[x_,y_],r_]]:=Circle[{x,y},r]

narisi[trikotnik[tocka[x_,y_],tocka[u_,v_],tocka[s_,t_]]]:={PointSize[Large],Point[{x,y}],Point[{u,v}],Point[{s,t}],
Line[{{x,y},{u,v},{s,t},{x,y}}]}

narisi[kot[tocka[x_,y_],tocka[u_,v_],tocka[s_,t_]]]:=
{HalfLine[{{x,y},{u,v}}],HalfLine[{{x,y},{s,t}}]}

narisi[l_List]:=narisi/@l
narisi[c_]:=c

slika[lst_List,opts___]:=Graphics[narisi/@lst,AspectRatio->Automatic,opts]

Primer uporabe:

slika[{trikotnik[tocka[0,0],tocka[1,0],tocka[(1/2),((Sqrt[3])/2)]],
Orange,Dashed,kroznica[tocka[(1/2),0],(1/2)]
}]

Izreki s predavanj

Sedaj bomo z Mathematico dokazovali izreke v ravniniski geometriji. Ideja je preprosta: vse naredimo s splošnimi koordinatami in računamo analitično. Res dobimo velike in nepregledne izraze, a Mathematica jih zna poenostaviti.

Omejili se bomo na osnovne izreke o trikotnikih. Definirajmo tri splošne točke v ravnini, ki bodo služile kot oglišča trikotnika:

splosnaLega={
a->tocka[(Subscript[x, 1]),(Subscript[y, 1])],
b->tocka[(Subscript[x, 2]),(Subscript[y, 2])],
c->tocka[(Subscript[x, 3]),(Subscript[y, 3])]
}

premica[a,c]/.splosnaLega

Opomba: izhodišče koordinatnega sistema bi lahko posavili v točko a. V tem primeru bi veljalo (Subscript[x, 1])=0 in (Subscript[y, 1])=0, kar bi nekoliko poenostavilo izračune. Poleg tega bi lahko točko b brez izgube splošnosti postavili v b=tocka[1,0].

posebnaLega={
a->tocka[0,0],
b->tocka[1,0],
c->tocka[x,y]
}

premica[a,c]/.posebnaLega

Očrtana krožnica

Izrek: Simetrale stranic trikotnika se sekajo v skupni točki, ki je središče trikotniku očrtanega kroga.

Ali se simetrale sekajo v eni točki, ugotovimo s funkcijo konkurentneQ:

konkurentneQ[
simetrala[a,b],
simetrala[b,c],
simetrala[c,a]
]/.splosnaLega

Ali je ta enačba veljavna? Poenostavimo jo z ukazom Simplify:

konkurentneQ[simetrala[a,b],simetrala[b,c],simetrala[c,a]]/.splosnaLega//Simplify

Preveriti moramo še, ali je sečišče simetral res enako oddaljeno od oglišč:

ClearAll[sredisceOcrtane]
sredisceOcrtane[a_tocka,b_tocka,c_tocka]:=tocka[simetrala[a,b],simetrala[b,c]]

razdalja2[a,sredisceOcrtane[a,b,c]]==
razdalja2[b,sredisceOcrtane[a,b,c]]==
razdalja2[c,sredisceOcrtane[a,b,c]]/.splosnaLega//Simplify

Definirajmo še funkcijo, ki izračuna očrtano krožnico:

ocrtanaKroznica[trikotnik[a_,b_,c_]]:=
kroznica[
sredisceOcrtane[a,b,c],
razdalja[a,sredisceOcrtane[a,b,c]]
]

ocrtanaKroznica[trikotnik[a,b,c]]/.splosnaLega//Simplify

Narišimo sliko:

Manipulate[
slika[{
trikotnik[a,b,c],
Blue,Thin,
simetrala[b,a],
simetrala[b,c],
simetrala[c,a],
sredisceOcrtane[a,b,c],
Red,Thick,
ocrtanaKroznica[trikotnik[a,b,c]]}/.
{a->tocka@@u,b->tocka@@v,c->tocka@@w},
PlotRange->{{-2,9},{-5,6}}],
{{u,{0,0}},Locator},
{{v,{7,0}},Locator},
{{w,{3,4}},Locator}]

Manipulate[u,{{u,{0,0}},Locator}]

h@@g[x,y,z]

f[{x,y,z,u}]

f@@{x,y,z,u}

Apply[f,{x,y,z,u}]

Višinska točka

Izrek: Višine trikotnika se sekajo v skupni točki, ki se imenuje višinska točka trikotnika.

Definirajmo nosilko višine trikotnika na prvem oglišču:

ClearAll[visina]
visina[a_tocka,b_tocka,c_tocka]:=pravokotnica[premica[b,c],a]

Višine so konkurente:

konkurentneQ[visina[a,b,c], visina[b,c,a], visina[c,a,b]]/.splosnaLega//Simplify

Višinska točka:

ClearAll[visinskaTocka]
visinskaTocka[a_tocka,b_tocka,c_tocka]:=tocka[pravokotnica[premica[b,c],a],pravokotnica[premica[c,a],b]]

Slika:

Manipulate[
Show[slika[{
trikotnik[a,b,c],
Thin,Blue,
visina[a,b,c],
visina[b,c,a],
visina[c,a,b],
Red,
visinskaTocka[a,b,c]}
/.{a->tocka@@u,b->tocka@@v,c->tocka@@w}
],PlotRange->{{-2,9},{-5,6}}],
{{u,{0,0}},Locator},
{{v,{7,0}},Locator},
{{w,{3,4}},Locator}]

Težišče

Izrek: Težiščnice trikotnika se sekajo v eni točki, ki se imenuje težišče.

Definiramo težišnico:

ClearAll[teziscnica]
teziscnica[a_tocka,b_tocka,c_tocka]:=daljica[a,razpolovisce[b,c]]

Preverimo, ali se sekajo v eni točki:

konkurentneQ[
nosilka[teziscnica[a,b,c]],
nosilka[teziscnica[b,c,a]],
nosilka[teziscnica[c,a,b]]
]/.splosnaLega//Simplify

Definirajmo težišče:

ClearAll[tezisce]
tezisce[a_tocka,b_tocka,c_tocka]:=
tocka[nosilka[teziscnica[a,b,c]],nosilka[teziscnica[b,c,a]]]

In še slika:

Manipulate[
Show[slika[{
trikotnik[a,b,c],
Thin,Blue,
teziscnica[a,b,c],
teziscnica[b,c,a],
teziscnica[c,a,b],
Red,
tezisce[a,b,c]}
/.{a->tocka@@u,b->tocka@@v,c->tocka@@w}
],PlotRange->{{-2,9},{-5,6}}],
{{u,{0,0}},Locator},
{{v,{7,0}},Locator},
{{w,{3,4}},Locator}]

Vaja 1: simetrala kota

Definiciji funkcije simetral dodajte primer simetrala[kot[p_,q_,r_]], ki vrne simetralo danega kota. Rešitev ponazorite z Manipulate. Uporabnik lahko premika vrh kota in točki na krakih ter opazuje, kako se spreminja simetrala kota.

simterala[kot[p_,q_,r_]]:=premica[tralala,hopsasa]

simterala[kot[p_tocka,q_tocka,r_tocka]]:=premica[tralala,hopsasa]

simetrala[kot[a,b,c]]

Vaja 2: zrcaljenje točke čez premico

Sestavite funkcijo zrcali[tocka[x_,y_],premica[a_,b_,c_]], ki dano točko prezrcali preko dane premice. Rešitev ponazorite z Manipulate.

Vaja 3: včrtana krožnica

Preverite naslednji izrek:

Izrek: Simetrale kotov trikotnika se sekajo v skupni točki, ki je središče trikotniku včrtanega kroga.

Sestavite tudi ustrezni funkciji, ki skonstruirata središče včrtane krožnice in včrtano krožnico. Izrek ponazorite z Manipulate.

Vaja 4: Eulerjeva daljica

Preverite naslednji izrek in ga ponazorite z Manipulate:

Definicija:  Eulerjeva daljica trikotnika je daljica, katere krajišči sta središče očrtane krožnice in višinska točka.

Izrek:  Težišče leži na Eulerjevi daljici in jo deli v razmerju 1:2.