Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình tìm giao điểm của hai đường thẳng trong C++


Cho các điểm A và B tương ứng với đường thẳng AB, và các điểm P và Q tương ứng với đường thẳng PQ; nhiệm vụ là tìm điểm giao giữa hai đường thẳng này.

Lưu ý – Các điểm được cho trên mặt phẳng 2D với tọa độ X và Y.

Chương trình tìm giao điểm của hai đường thẳng trong C++

Ở đây A(a1, a2), B(b1, b2) và C(c1, c2), D(d1, d2) là các tọa độ tạo thành hai đường thẳng riêng biệt, và P(p1, p2) là điểm giao (chỉ để minh họa sơ đồ cho điểm giao).

Cách tìm điểm giao

Xét hình vẽ trên như sau –

Ví dụ

Sử dụng (a1, a2), (b1, b2), (c1, c2), (d1, d2) ta tính:
A1 = b2 - a2
B1 = a1 - b1
C1 = (A1 * a1) + (B1 * a1)
A2 = d2 - c2
B2 = c1 - d1
C2 = (A2 * c1) + (B2 * c2)

Hai đường thẳng cho là:
1. A1x + B1y = C1
2. A2x + B2y = C2

Để tìm điểm giao, ta giải hệ 2 phương trình này.
Nhân 1 với B1 và 2 với B2, ta được:
A1B2x + B1B2y = C1B2
A1B1x + B2B1y = C1B1

Trừ hai phương trình ta được:
(A1B2 - A2B1)x = C1B2 - C2B1

Điều này cho giá trị của x, và tương tự ta sẽ tìm được giá trị của y, đó là điểm giao p1 là x và p2 là y.

Lưu ý – Công thức trên cho điểm giao của hai đường thẳng, nhưng nếu cho các đoạn thẳng thay vì đường thẳng, thì phải kiểm tra lại xem điểm tính được có nằm trên đoạn thẳng hay không.

  • min(x1, x2) ≤ x ≤ max(x1, x2)
  • min(y1, y2) ≤ y ≤ max(y1, y2)

Cách tiếp cận để giải bài toán trên –

  • Nhận các giá trị đầu vào.
  • Tìm định thức là a1 * b2 - a2 * b1
  • Kiểm tra nếu định thức = 0 thì hai đường thẳng song song
  • Nếu định thức khác 0 thì x = (c1 * b2 - c2 * b1) và y = (a1 * c2 - a2 * c1)
  • Trả về và in kết quả.

Thuật toán

Bắt đầu
Bước 1 -> Khai báo hàm in tọa độ x và y
    void display(mk_pair par)
    In par.first và par.second
Bước 2 -> Khai báo hàm tính điểm giao
    mk_pair intersection(mk_pair A, mk_pair B, mk_pair C, mk_pair D)
    Khai báo double a = B.second - A.second
    Khai báo double b = A.first - B.first
    Khai báo double c = a*(A.first) + b*(A.second)
    Khai báo double a1 = D.second - C.second
    Khai báo double b1 = C.first - D.first
    Khai báo double c1 = a1*(C.first) + b1*(C.second)
    Khai báo double det = a*b1 - a1*b
    NẾU (det = 0)
        trả về make_pair(FLT_MAX, FLT_MAX)
    Kết thúc
    NGƯỢC LẠI
        Khai báo double x = (b1*c - b*c1)/det
        Khai báo double y = (a*c1 - a1*c)/det
        trả về make_pair(x, y)
    Kết thúc
Bước 3 -> Trong main()
    Khai báo và gọi hàm cho các điểm như mk_pair q = make_pair(2, 1)
    NẾU (inter.first = FLT_MAX VÀ inter.second = FLT_MAX)
        In "hai đường thẳng cho là song song"
    Kết thúc
    NGƯỢC LẠI
        Gọi display(inter)
    Kết thúc
Kết thúc

Ví dụ mã C++

#include <bits/stdc++.h>
using namespace std;
#define mk_pair pair<double, double>

// Hiển thị tọa độ x và y
void display(mk_pair par) {
    cout << "(" << par.first << ", " << par.second << ")" << endl;
}

mk_pair intersection(mk_pair A, mk_pair B, mk_pair C, mk_pair D) {
    // Đường thẳng AB biểu diễn dưới dạng a1x + b1y = c1
    double a = B.second - A.second;
    double b = A.first - B.first;
    double c = a*(A.first) + b*(A.second);
    
    // Đường thẳng CD biểu diễn dưới dạng a2x + b2y = c2
    double a1 = D.second - C.second;
    double b1 = C.first - D.first;
    double c1 = a1*(C.first) + b1*(C.second);
    
    double det = a*b1 - a1*b;
    
    if (det == 0) {
        return make_pair(FLT_MAX, FLT_MAX);
    } else {
        double x = (b1*c - b*c1)/det;
        double y = (a*c1 - a1*c)/det;
        return make_pair(x, y);
    }
}

int main() {
    mk_pair q = make_pair(2, 1);
    mk_pair r = make_pair(2, 7);
    mk_pair s = make_pair(4, 4);
    mk_pair t = make_pair(6, 4);
    mk_pair inter = intersection(q, r, s, t);
    
    if (inter.first == FLT_MAX && inter.second == FLT_MAX) {
        cout << "Hai đường thẳng AB và CD cho là song song.\n";
    } else {
        cout << "Giao điểm của hai đường thẳng AB và CD cho là: ";
        display(inter);
    }
    return 0;
}

Đầu ra

Giao điểm của hai đường thẳng AB và CD cho là: (2, 4)