Dviejų atkarpų susikirtimo taško nustatymas. Ar tiesės susikerta: atkarpų sankirta plokštumoje 2 atkarpų sankirta yra taškas

Linijų susikirtimo taškas

Leiskite mums pateikti dvi tiesias linijas pagal jų koeficientus ir . Būtina 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 sudaryti 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 sprendinių sistema neturi (tiesioginio yra lygiagrečios 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 lygūs. iki nulio, tada linijos sutampa:

Įgyvendinimas

struct pt (dvigubas x, y;); struktūrinė eilutė (dviguba 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šykite 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 linijos, kurios vektorinė sandauga > 0, nes vektoriai yra orientuoti teigiamai.

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

Kad taškai ir , gulėti priešingose ​​linijos pusėse Pakanka, kad sąlyga< 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 – funkcija VektorMulti().

ax, ay yra pirmojo vektoriaus koordinatės,

bx, by yra antrojo vektoriaus koordinatės.

Programos 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;Funkcija LinesCross(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:=vectormulti(x4-x3,y4-y3,x2-x3,y2-y3); v3:=vectormulti(x2-x1,y2-y1,x3-x1,y3-y1); v4:=vectormulti(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 jų koordinatėmis nurodytos atkarpos susikerta.

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

Gerbiamas skaitytojau.

Jau perskaitėte keletą Geometrinių algoritmų serijos pamokų. Ar viskas parašyta? Būsiu labai dėkingas, jei paliksite atsiliepimą apie šias pamokas. Galbūt dar kažką reikia 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 pateikiamas 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 P1 ir P2.

Taškas P1 yra linijos kairėje P 3 P 4, jam vektorinė sandauga v1 > 0, nes vektoriai yra orientuoti teigiamai.
Taškas P2 esantis eilutės dešinėje, jai skirta vektorinė sandauga v2< 0 , nes vektoriai yra neigiamai orientuoti.

Parodyti P1 ir P2 gulėti priešingose ​​tiesios linijos pusėse P 3 P 4, pakanka, kad sąlyga 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 P3 ir P4.

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

Dviejų vektorių kryžminė sandauga apskaičiuojama pagal formulę:

kur:
kirvis, taip yra pirmojo vektoriaus koordinatės,
bx, pateikė yra antrojo vektoriaus koordinatės.

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

Tiesioje linijoje nurodomi du nesutampantys taškai: P1 su koordinatėmis ( x1;y1) ir P2 su koordinatėmis (x 2 ; y 2).

Linijų sankirta

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

Kryžminės sandaugos pagalba vektorių kolinariš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 \u003d (y 2 -y 1),
b \u003d (x 1 -x 2),
c \u003d x 1 (y 1 -y 2) + y 1 (x 2 -x 1)

Taigi, tiesią liniją galima nubrėžti (1) formos lygtimi.

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

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

Įveskite pavadinimus:

Čia D yra sistemos determinantas ir D x , D y yra determinantai, gauti pakeitus atitinkamo nežinomojo koeficientų stulpelį 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 \u003d D x / D, y 1 \u003d D y / D, kurios vadinamos Cramerio formulėmis. Mažas priminimas, kaip apskaičiuojamas antros eilės determinantas. Determinantas 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ę. Antrosios 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 pateikiamas 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 P1 ir P2.

Taškas P1 yra linijos kairėje P 3 P 4, jam vektorinė sandauga v1 > 0, nes vektoriai yra orientuoti teigiamai.
Taškas P2 esantis eilutės dešinėje, jai skirta vektorinė sandauga v2< 0 , nes vektoriai yra neigiamai orientuoti.

Parodyti P1 ir P2 gulėti priešingose ​​tiesios linijos pusėse P 3 P 4, pakanka, kad sąlyga 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 P3 ir P4.

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

Dviejų vektorių kryžminė 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, lygtis, nurodyta jų koordinatėmis.

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

Kryžminės sandaugos pagalba vektorių kolinariš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 \u003d (y 2 -y 1),
b \u003d (x 1 -x 2),
c \u003d x 1 (y 1 -y 2) + y 1 (x 2 -x 1)

Taigi, tiesią liniją galima nubrėžti (1) formos lygtimi.

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

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

Įveskite pavadinimus:

Čia D yra sistemos determinantas ir D x , D y yra determinantai, atsirandantys pakeitus atitinkamo nežinomojo koeficientų stulpelį 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 \u003d D x / D, y 1 \u003d D y / D, kurios vadinamos Cramerio formulėmis. Mažas priminimas, kaip apskaičiuojamas antros eilės determinantas. Determinantas 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ę. Antrosios eilės determinantas yra lygus pagrindinės įstrižainės elementų sandaugai, atėmus antrinės įstrižainės elementų sandaugai.