Punkt przecięcia

Daj nam dwie linie proste, określone przez ich współczynniki i . Musisz znaleźć ich punkt przecięcia lub dowiedzieć się, że linie są równoległe.

Rozwiązanie

Jeśli dwie linie nie są równoległe, to przecinają się. Aby znaleźć punkt przecięcia, wystarczy utworzyć układ dwóch równań prostych i rozwiązać go:

Korzystając ze wzoru Cramera, od razu znajdujemy rozwiązanie układu, które będzie pożądane punkt przecięcia:



Jeśli mianownik wynosi zero, tj.

wtedy system nie ma rozwiązań (bezpośrednio równoległy i nie pokrywają się) lub ma nieskończenie wiele (direct mecz). Jeżeli konieczne jest rozróżnienie tych dwóch przypadków, należy sprawdzić, czy współczynniki linii są proporcjonalne z tym samym współczynnikiem proporcjonalności co współczynniki i , dla czego wystarczy obliczyć oba wyznaczniki; jeśli oba są równe zeru, wówczas linie pokrywają się:

Realizacja

struktura pt(podwójne x, y;); linia struktury (podwójne a, b, c;); constdouble EPS =1e-9; podwójne det (podwójne a, podwójne b, podwójne c, podwójne d) (zwróć a * d - b * c;) bool przecięcie (linia m, linia n, pt i res) (podwójne 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;}

Lekcja z cyklu „ Algorytmy geometryczne»

Witaj drogi czytelniku.

Wskazówka 1: Jak znaleźć współrzędne punktu przecięcia dwóch linii

Napiszmy jeszcze trzy nowe funkcje.

Funkcja LinesCross() określi, czy przecinać czy dwa człon. W nim względne położenie segmentów określa się za pomocą produktów wektorowych. Do obliczenia iloczynów wektorowych napiszemy funkcję – VektorMulti().

Do realizacji operacji porównania zostanie użyta funkcja RealLess() „<” (строго меньше) для вещественных чисел.

Zadanie 1. Dwa segmenty są podane przez ich współrzędne. Napisz program, który to określi czy te odcinki przecinają się? bez znalezienia punktu przecięcia.

Rozwiązanie
. Drugi jest podawany kropkami.



Rozważmy segment i punkty oraz .

Punkt leży na lewo od linii i jest dla niego iloczynem wektorowym > 0, ponieważ wektory są zorientowane dodatnio.

Punkt znajduje się na prawo od prostej, dla której znajduje się iloczyn wektorowy < 0, так как векторы отрицательно ориентированы.

Aby punkty i leżały po przeciwnych stronach prostej wystarczy, że warunek będzie spełniony< 0 (векторные произведения имели противоположные знаки).

Podobne rozumowanie można przeprowadzić dla odcinka i punktów oraz .

Więc jeśli , to odcinki się przecinają.

Aby sprawdzić ten warunek, używana jest funkcja LinesCross(), a do obliczania iloczynów wektorowych służy funkcja VektorMulti().

ax, ay – współrzędne pierwszego wektora,

bx, by – współrzędne drugiego wektora.

Zaprogramuj geometrię4; (Czy 2 odcinki przecinają się?) Const _Eps: Real=1e-4; (dokładność obliczeń) var x1,y1,x2,y2,x3,y3,x4,y4: rzeczywista; var v1,v2,v3,v4: real;funkcja RealLess(Const a, b: Real): Boolean; (Ściśle mniej niż) rozpocząć RealLess:= b-a> _Eps end; (RealLess)funkcja VektorMulti(ax,ay,bx,by:real): real; (ax,ay - współrzędne a bx,by - współrzędne b) rozpocząć vektormulti:= ax*by-bx*ay; koniec;Linie funkcyjneCross(x1,y1,x2,y2,x3,y3,x4,y4:real): wartość logiczna; (Czy odcinki się przecinają?) rozpocząć 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); jeśli RealLess(v1*v2,0) i 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.

Wyniki wykonania programu:

Podaj współrzędne odcinków: -1 1 2 2,52 2 1 -1 3
Tak.

Napisaliśmy program, który sprawdza, czy odcinki określone przez ich współrzędne przecinają się.

Na następnej lekcji utworzymy algorytm, za pomocą którego można określić, czy punkt leży wewnątrz trójkąta.

Drogi Czytelniku.

Zapoznałeś się już z kilkoma lekcjami z serii Algorytmy geometryczne. Czy wszystko jest napisane w przystępny sposób? Będę bardzo wdzięczny, jeśli zostawisz opinię na temat tych lekcji. Być może trzeba coś jeszcze poprawić.

Z poważaniem, Vera Gospodarets.

Niech zostaną dane dwa segmenty. Pierwszą z nich wyznaczają kropki P 1 (x 1 ; y 1) I P 2 (x 2 ; y 2). Drugie jest przyznawane punktami P 3 (x 3 ; y 3) I P 4 (x 4 ; y 4).

Względne położenie segmentów można sprawdzić za pomocą produktów wektorowych:

Rozważ segment P 3 P 4 i kropki P 1 I P2.

Kropka P 1 leży na lewo od linii P 3 P 4, dla niej iloczyn wektorowy v 1 > 0, ponieważ wektory są zorientowane dodatnio.
Kropka P2 znajduje się na prawo od linii, jest to iloczyn wektorowy v 2< 0 , ponieważ wektory są zorientowane ujemnie.

Aby podkreślić sprawę P 1 I P2 leżeć po przeciwnych stronach linii prostej P 3 P 4, wystarczy, aby warunek był spełniony v 1 v 2< 0 (produkty wektorowe miały przeciwne znaki).

Podobne rozumowanie można przeprowadzić dla segmentu P 1 P 2 i punkty P 3 I P 4.

Więc jeśli v 1 v 2< 0 I v 3 v 4< 0 , to odcinki się przecinają.

Iloczyn krzyżowy dwóch wektorów oblicza się ze wzoru:

Gdzie:
topór, tak— współrzędne pierwszego wektora,
bx, przez— współrzędne drugiego wektora.

Równanie prostej przechodzącej przez dwa różne punkty określone przez ich współrzędne.

Niech na linii prostej zostaną dane dwa nie pokrywające się punkty: P 1 ze współrzędnymi ( x 1 ;y 1) I P2 ze współrzędnymi (x 2 ; y 2).

Przecięcie linii

Odpowiednio wektor mający początek w punkcie P 1 i zakończyć w pewnym momencie P2 ma współrzędne (x 2 -x 1 , y 2 -y 1). Jeśli P(x, y) jest dowolnym punktem na linii, to współrzędne wektora P 1 P równy (x - x 1, y - y 1).

Korzystając z iloczynu wektorowego, warunek kolinearności wektorów P 1 P I P 1 P 2 można zapisać w ten sposób:
|P 1 P, P 1 P 2 |=0, tj. (x-x 1)(y 2 -y 1)-(y-y 1)(x 2 -x 1)=0
Lub
(y 2 -y 1)x + (x 1 -x 2)y + x 1 (y 1 -y 2) + y 1 (x 2 -x 1) = 0

Ostatnie równanie przepisuje się w następujący sposób:
topór + o + c = 0, (1)
Gdzie
a = (y 2 - y 1),
b = (x 1 -x 2),
do = x 1 (y 1 -y 2) + y 1 (x 2 -x 1)

Zatem linię prostą można określić za pomocą równania postaci (1).

Jak znaleźć punkt przecięcia prostych?
Oczywistym rozwiązaniem jest rozwiązanie układu równań liniowych:

topór 1 +o 1 =-c 1
topór 2 +o 2 =-c 2
(2)

Wprowadź symbole:

Tutaj D jest wyznacznikiem systemu, oraz Dx, Dy— wyznaczniki powstałe w wyniku zastąpienia kolumny współczynników odpowiednią niewiadomą kolumną wolnych wyrazów. Jeśli D ≠ 0, to układ (2) jest określony, czyli ma jednoznaczne rozwiązanie. Rozwiązanie to można znaleźć korzystając z następujących wzorów: x 1 =D x /D, y 1 =D y /D, które nazywane są wzorami Cramera. Szybkie przypomnienie, jak oblicza się wyznacznik drugiego rzędu. Wyznacznik wyróżnia dwie przekątne: główną i wtórną. Na przekątną główną składają się elementy wzięte w kierunku od lewego górnego rogu wyznacznika do prawego dolnego rogu. Boczna przekątna - od prawego górnego do lewego dolnego rogu. Wyznacznik drugiego rzędu jest równy iloczynowi elementów przekątnej głównej minus iloczyn elementów przekątnej wtórnej.

Niech zostaną dane dwa segmenty. Pierwszą z nich wyznaczają kropki P 1 (x 1 ; y 1) I P 2 (x 2 ; y 2). Drugie jest przyznawane punktami P 3 (x 3 ; y 3) I P 4 (x 4 ; y 4).

Względne położenie segmentów można sprawdzić za pomocą produktów wektorowych:

Rozważ segment P 3 P 4 i kropki P 1 I P2.

Kropka P 1 leży na lewo od linii P 3 P 4, dla niej iloczyn wektorowy v 1 > 0, ponieważ wektory są zorientowane dodatnio.
Kropka P2 znajduje się na prawo od linii, jest to iloczyn wektorowy v 2< 0 , ponieważ wektory są zorientowane ujemnie.

Aby podkreślić sprawę P 1 I P2 leżeć po przeciwnych stronach linii prostej P 3 P 4, wystarczy, aby warunek był spełniony v 1 v 2< 0 (produkty wektorowe miały przeciwne znaki).

Podobne rozumowanie można przeprowadzić dla segmentu P 1 P 2 i punkty P 3 I P 4.

Więc jeśli v 1 v 2< 0 I v 3 v 4< 0 , to odcinki się przecinają.

Iloczyn krzyżowy dwóch wektorów oblicza się ze wzoru:

Gdzie:
topór, tak- współrzędne pierwszego wektora,
bx, przez- współrzędne drugiego wektora.

Równanie prostej przechodzącej przez dwa różne punkty określone przez ich współrzędne.

Niech na linii prostej zostaną dane dwa nie pokrywające się punkty: P 1 ze współrzędnymi ( x 1 ;y 1) I P2 ze współrzędnymi (x 2 ; y 2). Odpowiednio wektor mający początek w punkcie P 1 i zakończyć w pewnym momencie P2 ma współrzędne (x 2 -x 1 , y 2 -y 1). Jeśli P(x, y) jest dowolnym punktem na linii, to współrzędne wektora P 1 P równy (x - x 1, y - y 1).

Korzystając z iloczynu wektorowego, warunek kolinearności wektorów P 1 P I P 1 P 2 można zapisać w ten sposób:
|P 1 P , P 1 P 2 |=0, tj. (x-x 1)(y 2 -y 1)-(y-y 1)(x 2 -x 1)=0
Lub
(y 2 -y 1)x + (x 1 -x 2)y + x 1 (y 1 -y 2) + y 1 (x 2 -x 1) = 0

Ostatnie równanie przepisuje się w następujący sposób:
topór + o + c = 0, (1)
Gdzie
a = (y 2 - y 1),
b = (x 1 -x 2),
do = x 1 (y 1 -y 2) + y 1 (x 2 -x 1)

Zatem linię prostą można określić za pomocą równania postaci (1).

Jak znaleźć punkt przecięcia prostych?
Oczywistym rozwiązaniem jest rozwiązanie układu równań liniowych:

topór 1 +o 1 =-c 1
topór 2 +o 2 =-c 2
(2)

Wprowadź symbole:

Tutaj D jest wyznacznikiem systemu, oraz Dx, Dy- wyznaczniki powstałe w wyniku zastąpienia kolumny współczynników odpowiednią niewiadomą kolumną wolnych wyrazów. Jeśli D ≠ 0, to układ (2) jest określony, czyli ma jednoznaczne rozwiązanie. Rozwiązanie to można znaleźć korzystając z następujących wzorów: x 1 =D x /D, y 1 =D y /D, które nazywane są wzorami Cramera. Szybkie przypomnienie, jak oblicza się wyznacznik drugiego rzędu. Wyznacznik wyróżnia dwie przekątne: główną i wtórną. Na przekątną główną składają się elementy wzięte w kierunku od lewego górnego rogu wyznacznika do prawego dolnego rogu. Boczna przekątna - od prawego górnego do lewego dolnego rogu. Wyznacznik drugiego rzędu jest równy iloczynowi elementów przekątnej głównej minus iloczyn elementów przekątnej wtórnej.


Zamknąć