Susikirtimo taškas

Leiskite mums pateikti dvi tiesias linijas, apibrėžtas jų koeficientais ir . Turite rasti jų susikirtimo tašką arba sužinoti, kad linijos yra lygiagrečios.

Sprendimas

Jei dvi tiesės nėra lygiagrečios, jos susikerta. Norint rasti susikirtimo tašką, pakanka sukurti dviejų tiesių lygčių sistemą ir ją išspręsti:

Naudodami Cramerio formulę iškart randame sistemos sprendimą, kuris bus norimas susikirtimo taškas:



Jei vardiklis lygus nuliui, t.y.

tada sistema neturi sprendimų (tiesioginis lygiagrečiai ir nesutampa) arba turi be galo daug (tiesioginis rungtynės). Jei reikia atskirti šiuos du atvejus, reikia patikrinti, ar tiesių koeficientai yra proporcingi su tokiu pat proporcingumo koeficientu kaip ir koeficientai, kuriems pakanka apskaičiuoti du determinantus; jei jie abu yra lygus nuliui, tada linijos sutampa:

Įgyvendinimas

struct pt(double x, y;); struct line(double a, b, c;); constdouble EPS =1e-9; double det (double a, double b, double c, double d)(grąžinti a * d - b * c;) bool susikerta (tiesė m, linija n, pt & res)(double zn = det (m.a, m.b, n.a) , n.b);if(abs(zn)< EPS)returnfalse; res.x=- det (m.c, m.b, n.c, n.b)/ zn; res.y=- det (m.a, m.c, n.a, n.c)/ zn;returntrue;} bool parallel (line m, line n){returnabs(det (m.a, m.b, n.a, n.b))< EPS;} bool equivalent (line m, line n){returnabs(det (m.a, m.b, n.a, n.b))< EPS &&abs(det (m.a, m.c, n.a, n.c))< EPS &&abs(det (m.b, m.c, n.b, n.c))< EPS;}

Pamoka iš serijos “ Geometriniai algoritmai»

Sveiki mielas skaitytojau.

1 patarimas: kaip rasti dviejų linijų susikirtimo taško koordinates

Parašykime dar tris naujas funkcijas.

Funkcija LinesCross() nustatys, ar susikerta ar du segmentas. Jame santykinė segmentų padėtis nustatoma naudojant vektorinius sandaugus. Norėdami apskaičiuoti vektorines sandaugas, parašysime funkciją – VektorMulti().

Funkcija RealLess() bus naudojama palyginimo operacijai įgyvendinti<” (строго меньше) для вещественных чисел.

1 užduotis. Du segmentai pateikiami pagal jų koordinates. Parašykite programą, kuri nustato ar šie segmentai susikerta? neradęs susikirtimo taško.

Sprendimas
. Antrasis pateikiamas taškais.



Apsvarstykite segmentą ir taškus ir .

Taškas yra kairėje nuo linijos, jam vektorinė sandauga > 0, nes vektoriai yra orientuoti teigiamai.

Taškas yra dešinėje linijos, kurios vektorinė sandauga yra < 0, так как векторы отрицательно ориентированы.

Kad taškai būtų priešingose ​​tiesės pusėse, pakanka, kad sąlyga būtų įvykdyta< 0 (векторные произведения имели противоположные знаки).

Panašus samprotavimas gali būti atliktas ir segmentui bei taškams ir .

Taigi, jei , tada atkarpos susikerta.

Šiai sąlygai patikrinti naudojama funkcija LinesCross(), o vektorinių sandaugų skaičiavimui naudojama funkcija VektorMulti().

ax, ay – pirmojo vektoriaus koordinatės,

bx, by – antrojo vektoriaus koordinatės.

Programa geometrija4; (Ar susikerta 2 atkarpos?) Const _Eps: Real=1e-4; (skaičiavimo tikslumas) var x1,y1,x2,y2,x3,y3,x4,y4: realus; var v1,v2,v3,v4: realus;funkcija RealLess(Const a, b: Real): Būlio reikšmė; (Griežtai mažiau nei) begin RealLess:= b-a> _Eps end; (RealLess)funkcija VektorMulti(ax,ay,bx,by:real): realus; (ax,ay - a koordinatės bx,by - b koordinatės) begin vektormulti:= ax*by-bx*ay; pabaiga;Funkcijų linijos(x1,y1,x2,y2,x3,y3,x4,y4:real): loginis; (Ar atkarpos susikerta?) begin v1:=vektormulti(x4-x3,y4-y3,x1-x3,y1-y3); v2:=vektormulti(x4-x3,y4-y3,x2-x3,y2-y3); v3:=vektormulti(x2-x1,y2-y1,x3-x1,y3-y1); v4:=vektormulti(x2-x1,y2-y1,x4-x1,y4-y1); jei RealLess(v1*v2,0) ir RealLess(v3*v4,0) (v1v2<0 и v3v4<0, отрезки пересекаются} then LinesCross:= true else LinesCross:= false end; {LinesCross}begin {main} writeln(‘Введите координаты отрезков: x1,y1,x2,y2,x3,y3,x4,y4’); readln(x1,y1,x2,y2,x3,y3,x4,y4); if LinesCross(x1,y1,x2,y2,x3,y3,x4,y4) then writeln (‘Да’) else writeln (‘Нет’) end.

Programos vykdymo rezultatai:

Įveskite atkarpų koordinates: -1 1 2 2.52 2 1 -1 3
Taip.

Parašėme programą, kuri nustato, ar atkarpos, nurodytos jų koordinatėmis, susikerta.

Kitoje pamokoje sukursime algoritmą, pagal kurį galima nustatyti, ar taškas yra trikampio viduje.

Gerbiamas skaitytojau.

Jau susipažinote su keliomis Geometrinių algoritmų serijos pamokomis. Ar viskas parašyta prieinamu būdu? Būsiu labai dėkingas, jei paliksite atsiliepimą apie šias pamokas. Galbūt dar reikia ką nors patobulinti.

Pagarbiai Vera Gospodarets.

Tegu pateikiami du segmentai. Pirmasis pateikiamas taškais P 1 (x 1 ;y 1) Ir P 2 (x 2 ;y 2). Antrasis suteikiamas taškais P 3 (x 3 ;y 3) Ir P 4 (x 4 ;y 4).

Santykinę segmentų padėtį galima patikrinti naudojant vektorinius produktus:

Apsvarstykite segmentą P 3 P 4 ir taškais P 1 Ir P2.

Taškas P 1 yra linijos kairėje P 3 P 4, jai vektorinis produktas v 1 > 0, nes vektoriai yra orientuoti teigiamai.
Taškas P2 esantis eilutės dešinėje, jai skirta vektorinė sandauga v 2< 0 , nes vektoriai yra neigiamai orientuoti.

Kad būtų taškas P 1 Ir P2 gulėti priešingose ​​tiesios linijos pusėse P 3 P 4, pakanka, kad sąlyga būtų įvykdyta prieš 1 prieš 2< 0 (vektoriniai produktai turėjo priešingus ženklus).

Panašius argumentus galima atlikti ir segmentui P 1 P 2 ir taškais P 3 Ir P 4.

Taigi, jei prieš 1 prieš 2< 0 Ir 3 prieš 4< 0 , tada atkarpos susikerta.

Dviejų vektorių vektorinė sandauga apskaičiuojama pagal formulę:

Kur:
kirvis, taip— pirmojo vektoriaus koordinates,
bx, pateikė— antrojo vektoriaus koordinatės.

Tiesės, einančios per du skirtingus taškus, apibrėžtus jų koordinatėmis, lygtis.

Tiesioje linijoje nurodomi du nesutampantys taškai: P 1 su koordinatėmis ( x 1 ;y 1) Ir P2 su koordinatėmis (x 2 ; y 2).

Linijų susikirtimas

Atitinkamai vektorius, kurio pradžia yra taške P 1 ir baigiasi taške P2 turi koordinates (x 2 -x 1, y 2 -y 1). Jeigu P(x, y) yra savavališkas tiesės taškas, tada vektoriaus koordinatės P 1 P lygus (x – x 1, y – y 1).

Naudojant vektorių sandaugą, vektorių kolineariškumo sąlyga P 1 P Ir P 1 P 2 galima parašyti taip:
|P 1 P,P 1 P 2 |=0, t.y. (x-x 1) (y 2 -y 1)-(y-y 1) (x 2 -x 1) = 0
arba
(y 2 -y 1)x + (x 1 -x 2)y + x 1 (y 1 -y 2) + y 1 (x 2 -x 1) = 0

Paskutinė lygtis perrašoma taip:
ax + by + c = 0, (1)
Kur
a = (y 2 -y 1),
b = (x 1 - x 2),
c = x 1 (y 1 - y 2) + y 1 (x 2 - x 1)

Taigi, tiesią liniją galima nurodyti (1) formos lygtimi.

Kaip rasti linijų susikirtimo tašką?
Akivaizdus sprendimas yra išspręsti tiesių lygčių sistemą:

ax 1 +by 1 =-c 1
ax 2 +by 2 =-c 2
(2)

Įveskite simbolius:

Čia D yra sistemos determinantas ir Dx, Dy— determinantai, atsirandantys pakeitus koeficientų stulpelį atitinkamu nežinomuoju laisvųjų terminų stulpeliu. Jeigu D ≠ 0, tada sistema (2) yra apibrėžta, tai yra, ji turi unikalų sprendimą. Šį sprendimą galima rasti naudojant šias formules: x 1 = D x / D, y 1 = D y / D, kurios vadinamos Cramerio formulėmis. Greitas priminimas, kaip apskaičiuojamas antros eilės determinantas. Determinantas išskiria dvi įstrižaines: pagrindinę ir antrinę. Pagrindinę įstrižainę sudaro elementai, paimti kryptimi nuo viršutinio kairiojo determinanto kampo iki apatinio dešiniojo kampo. Šoninė įstrižainė - iš viršutinės dešinės į apatinę kairę. Antros eilės determinantas yra lygus pagrindinės įstrižainės elementų sandaugai, atėmus antrinės įstrižainės elementų sandaugai.

Tegu pateikiami du segmentai. Pirmasis pateikiamas taškais P 1 (x 1 ;y 1) Ir P 2 (x 2 ;y 2). Antrasis suteikiamas taškais P 3 (x 3 ;y 3) Ir P 4 (x 4 ;y 4).

Santykinę segmentų padėtį galima patikrinti naudojant vektorinius produktus:

Apsvarstykite segmentą P 3 P 4 ir taškais P 1 Ir P2.

Taškas P 1 yra linijos kairėje P 3 P 4, jai vektorinis produktas v 1 > 0, nes vektoriai yra orientuoti teigiamai.
Taškas P2 esantis eilutės dešinėje, jai skirta vektorinė sandauga v 2< 0 , nes vektoriai yra neigiamai orientuoti.

Kad būtų taškas P 1 Ir P2 gulėti priešingose ​​tiesios linijos pusėse P 3 P 4, pakanka, kad sąlyga būtų įvykdyta prieš 1 prieš 2< 0 (vektoriniai produktai turėjo priešingus ženklus).

Panašius argumentus galima atlikti ir segmentui P 1 P 2 ir taškais P 3 Ir P 4.

Taigi, jei prieš 1 prieš 2< 0 Ir 3 prieš 4< 0 , tada atkarpos susikerta.

Dviejų vektorių vektorinė sandauga apskaičiuojama pagal formulę:

Kur:
kirvis, taip- pirmojo vektoriaus koordinatės,
bx, pateikė- antrojo vektoriaus koordinatės.

Tiesės, einančios per du skirtingus taškus, apibrėžtus jų koordinatėmis, lygtis.

Tiesioje linijoje nurodomi du nesutampantys taškai: P 1 su koordinatėmis ( x 1 ;y 1) Ir P2 su koordinatėmis (x 2 ; y 2). Atitinkamai vektorius, kurio pradžia yra taške P 1 ir baigiasi taške P2 turi koordinates (x 2 -x 1, y 2 -y 1). Jeigu P(x, y) yra savavališkas tiesės taškas, tada vektoriaus koordinatės P 1 P lygus (x – x 1, y – y 1).

Naudojant vektorių sandaugą, vektorių kolineariškumo sąlyga P 1 P Ir P 1 P 2 galima parašyti taip:
|P 1 P ,P 1 P 2 |=0, t.y. (x-x 1) (y 2 -y 1)-(y-y 1) (x 2 -x 1) = 0
arba
(y 2 -y 1)x + (x 1 -x 2)y + x 1 (y 1 -y 2) + y 1 (x 2 -x 1) = 0

Paskutinė lygtis perrašoma taip:
ax + by + c = 0, (1)
Kur
a = (y 2 -y 1),
b = (x 1 - x 2),
c = x 1 (y 1 - y 2) + y 1 (x 2 - x 1)

Taigi, tiesią liniją galima nurodyti (1) formos lygtimi.

Kaip rasti linijų susikirtimo tašką?
Akivaizdus sprendimas yra išspręsti tiesių lygčių sistemą:

ax 1 +by 1 =-c 1
ax 2 +by 2 =-c 2
(2)

Įveskite simbolius:

Čia D yra sistemos determinantas ir Dx, Dy- determinantai, atsirandantys pakeitus koeficientų stulpelį atitinkamu nežinomuoju laisvųjų terminų stulpeliu. Jeigu D ≠ 0, tada sistema (2) yra apibrėžta, tai yra, ji turi unikalų sprendimą. Šį sprendimą galima rasti naudojant šias formules: x 1 = D x / D, y 1 = D y / D, kurios vadinamos Cramerio formulėmis. Greitas priminimas, kaip apskaičiuojamas antros eilės determinantas. Determinantas išskiria dvi įstrižaines: pagrindinę ir antrinę. Pagrindinę įstrižainę sudaro elementai, paimti kryptimi nuo viršutinio kairiojo determinanto kampo iki apatinio dešiniojo kampo. Šoninė įstrižainė - iš viršutinės dešinės į apatinę kairę. Antros eilės determinantas yra lygus pagrindinės įstrižainės elementų sandaugai, atėmus antrinės įstrižainės elementų sandaugai.


Uždaryti