Giao của các đoạn thẳng, đường thẳng, tia

Một phần của tài liệu Tích hợp liên môn chủ đề hình học phẳng trong tin học (Trang 23 - 29)

2. Ứng dụng tính chất hình học phẳng vào giải quyết một số bài toán Tin có yếu

2.2.1. Một số bài toán cơ bản

2.2.1.3. Giao của các đoạn thẳng, đường thẳng, tia

Bài toán 4.

Tìm giao điểm (nếu có) của hai đường thẳng có phương trình tổng quát:

A1x + B1y + C1 = 0 và A2x + B2y + C2 = 0.

Hướng dẫn:

Dựa vào giải và biện luận hệ hai phương trình bậc nhất hai ẩn suy ra kết luận cần tìm.

Bài toán 5.

Cho 2 đoạn thẳng AB và CD, toạ độ các điểm mút là A(X1, Y1), B(X2, Y2), C(X3, Y3) và D(X4, Y4). Hãy xét xem hai đoạn thẳng này có giao nhau không?

Hướng dẫn:

a) Cách 1:

Tìm giao điểm của 2 đường thẳng AB và CD, sau đó kiểm tra xem giao điểm có thuộc đồng thời cả hai đoạn thẳng AB và CD hay không?

b) Cách 2:

Đoạn thẳng AB cắt đoạn thẳng CD trong các trường hợp sau:

A hoặc B thuộc đoạn thẳng CD.

C hoặc D thuộc đoạn thẳng AB.

Đoạn thẳng AB và đoạn thẳng CD giao nhau tại điểm M khác đầu mút của hai đoạn thẳng này khi: A, B khác phía nhau so với đường thẳng CD đồng thời C, D khác phía nhau so với đường thẳng AB. Gọi phương trình đường thẳng AB là F(x, y)=0, phương trình đường thẳng CD là G(x, y)=0 thì điều kiện để đoạn thẳng AB và đoạn thẳng CD giao nhau là: F(X3, Y3)F(X4, Y4)<0 và G(X1, Y1)G(X2, Y2)<0.

Bài toán 6.

Cho tia AM chứa điểm B (khác A) và đoạn thẳng CD, biết toạ độ các điểm là A(X1, Y1), B(X2, Y2), C(X3, Y3) và D(X4, Y4).

Hãy xét xem tia AM có cắt đoạn thẳng CD hay không?

Hướng dẫn:

Tia AM cắt đoạn thẳng CD trong các trường hợp sau:

A thuộc đoạn thẳng CD.

C hoặc D thuộc tia AM.

C và D khác phía nhau so với đường thẳng AB đồng thời trên tia AM nếu chọn một điểm M(XM, YM) khá xa A thì A và M khác phía nhau so với đường thẳng CD.

Chọn điểm M khá xa A tới mức sao cho:

|XM|>Max{|XC|, |XD|} và |YM|> Max{|YC|, |YD|}.

Cũng có thể giải trực tiếp như sau: Tìm giao điểm E của đường thẳng AB và đường thẳng CD (bài 4). Sau đó chứng tỏ E thuộc tia AM (bài 3) và thuộc đoạn thẳng CD (bài 2).

2.2.1.4. Code tìm giao điểm của 2 đường thẳng, 2 đoạn thẳng, 2 tia. (file hinhhoc3.cpp).

#include <bits/stdc++.h>

using namespace std;

#define int long long

#define II pair < int , int >

#define fi first

#define se second

#define pb push_back const double inf = 1e9;

const int Array_Size = 1e5 + 5;

struct Path // Phuong trinh duong thang {

double a , b , c;

};

struct Vector // Toa do vector {

double x , y;

};

typedef Vector Point;

double operator * (Vector A , Vector B) {

return A.x * B.y - A.y * B.x;

}

Point M , N , A , B , C , D , a[Array_Size];

int n;

Path Get_Path(Point A , Point B) // Tra ve phuong trinh duong thang AB {

Vector U = {B.x - A.x , B.y - A.y};

double a = -U.y , b = U.x , c = - (a * A.x + b * A.y);

return {a , b , c};

}

Point Intersect(Path X , Path Y) // Tra ve giao diem 2 duong thang X va Y {

double a1 = X.a , b1 = X.b , c1 = -X.c;

double a2 = Y.a , b2 = Y.b , c2 = -Y.c;

double D = a1 * b2 - a2 * b1;

double Dx = c1 * b2 - c2 * b1;

double Dy = a1 * c2 - a2 * c1;

if(D == 0) {

if(Dx == Dy && Dx == 0) return {-inf , 0};

else return {inf , 0};

}

else return {Dx * 1.0 / D , Dy * 1.0 / D};

}

double F(Point M , Point A , Point B) // Thay M vao phuong trinh duong thang AB {

Path D = Get_Path(A , B); // Phuong trinh duong thang AB return M.x * D.a + M.y * D.b + D.c;

}

bool Kiem_Tra_Diem_Thuoc_Duong_Thang(Point M , Point A , Point B) {

if(F(M , A , B) == 0) return true;

return false;

}

bool Kiem_Tra_Diem_Thuoc_Doan_Thang(Point M , Point A , Point B) {

if(F(M , A , B) == 0 && min(A.x , B.x) <= M.x && M.x <= max(A.x , B.x)

&& min(A.y , B.y) <= M.y && M.y <= max(A.y , B.y)) return true;

return false;

}

bool Kiem_Tra_Diem_Thuoc_Tia(Point M , Point A , Point B) {

if(F(M , A , B) == 0 && (M.x - A.x) * (B.x - A.x) >= 0 && (M.y - A.y) * (B.y - A.y) >= 0) return true;

return false;

}

bool Kiem_Tra_Vi_Tri_2_Diem(Point M , Point N , Point A , Point B) {

if(F(M , A , B) * F(N , A , B) < 0) return true;

return false;

}

void Input() {

cin >> M.x >> M.y;

cin >> N.x >> N.y;

cin >> A.x >> A.y;

cin >> B.x >> B.y;

cin >> C.x >> C.y;

cin >> D.x >> D.y;

cin >> n;

for(int i = 0 ; i < n ; ++i) cin >> a[i].x >> a[i].y;

a[n] = a[0];

cout << fixed << setprecision(3);

}

namespace Tim_Giao_Diem {

void Solve() {

Point M = Intersect(Get_Path(A , B) , Get_Path(C , D)); // Giao diem 2 duong thang AB va CD

// Tim giao diem 2 duong thang AB va CD

if(M.x == inf) cout << "2 duong thang song song\n";

else {

if(M.x == -inf) cout << "2 duong thang trung nhau\n";

else cout << "Giao diem la: (" << M.x << ',' << M.y << ")\n";

}

// Tim giao diem 2 doan thang AB va CD

if(M.x == inf) cout << "2 doan thang khong cat nhau\n";

else {

if(M.x == -inf) cout << "2 doan thang co vo so giao diem\n";

else {

if (Kiem_Tra_Diem_Thuoc_Doan_Thang(M , A , B) &&

Kiem_Tra_Diem_Thuoc_Doan_Thang(M , C , D)) cout << "Giao diem la: (" << M.x

<< ',' << M.y << ")\n";

else cout << "2 doan thang khong cat nhau\n";

} }

cout << '\n';

} }

#undef int int main() {

// if(fopen("trash.inp" , "r"))

// freopen("trash.inp" , "r" , stdin) , freopen("trash.out" , "w" , stdout);

ios::sync_with_stdio(0);

cin.tie(0);

cout.tie(0);

Input();

Tim_Giao_Diem::Solve();

}

Một phần của tài liệu Tích hợp liên môn chủ đề hình học phẳng trong tin học (Trang 23 - 29)

Tải bản đầy đủ (DOCX)

(45 trang)
w