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.

Ở đâ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)