题解 | 两直线交点
两直线交点
https://www.nowcoder.com/practice/b14130882e704fd6aa57f8762ae17bac
#include <bits/stdc++.h>
using namespace std;
struct point {
double x, y;
point(double A, double B) {
x = A, y = B;
}
point() = default;
};
struct line {
point point_A, point_B;
line(point A, point B) {
point_A = A, point_B = B;
}
line() = default;
};
point findMeetingPoint(line line_A, line line_B) {
double px, py; // 所求坐标
double x1 = line_A.point_A.x, y1 = line_A.point_A.y;
double x2 = line_A.point_B.x, y2 = line_A.point_B.y; // A方程的两个点
double x3 = line_B.point_A.x, y3 = line_B.point_A.y;
double x4 = line_B.point_B.x, y4 = line_B.point_B.y; // B方程的两个点
// 求出AB两点的直线一般式方程
double A1 = y2 - y1;
double B1 = x1 - x2;
double C1 = x2 * y1 - x1 * y2;
// 求出CD两点的直线一般式方程
double A2 = y4 - y3;
double B2 = x3 - x4;
double C2 = x4 * y3 - x3 * y4;
// 判断是否平行
double k1 = (A1 / B1) * -1.0;
double k2 = (A2 / B2) * -1.0;
if (k1 == k2) {
return point(-1, -1);
}else {
px = (B1 * C2 - B2 * C1) / (A1 * B2 - A2 * B1);
py = (C1 * A2 - C2 * A1) / (A1 * B2 - A2 * B1);
return point(px, py);
}
}
int main() {
point A, B, C, D;
cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y >> D.x >> D.y;
line AB = line(A, B);
line CD = line(C, D);
point ans = findMeetingPoint(AB, CD);
cout << fixed << setprecision(12) << ans.x << " " << ans.y;
return 0;
}