首页 > 试题广场 >

两直线交点

[编程题]两直线交点
  • 热度指数:664 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}你需要实现一个函数,接受的参数为两条直线 AB、CD,返回值为点类型的两直线的交点。
\hspace{15pt}
\hspace{15pt}函数接收的参数为:
{\hspace{20pt}}_\texttt{1.}\,由点 A 和点 B 构成的直线 AB
{\hspace{20pt}}_\texttt{2.}\,由点 C 和点 D 构成的直线 CD

\hspace{15pt}你需要实现的函数的返回值为:
\hspace{23pt}\bullet\,由直线 AB 和直线 CD 相交而得到的交点 P。若两直线交点不唯一,则返回点 (-1,-1)

输入描述:
\hspace{15pt}提供输入格式只是方便您在代码出错时进行调试,你只需要按照题目描述实现函数即可,并不需要关心数据的实际输入格式。

\hspace{15pt}输入包含两行:
\hspace{23pt}\bullet\,第一行包含四个正整数,分别为点 A 的横纵坐标的点 B 的横纵坐标。
\hspace{23pt}\bullet\,第二行包含四个正整数,分别为点 C 的横纵坐标的点 D 的横纵坐标。
\hspace{15pt}数据保证点 A 和点 B 不重合,点 C 和点 D 不重合,且若交点 P 存在则其横纵坐标的绝对值均在 10^4 以内。


输出描述:
\hspace{15pt}提供输出格式只是方便您在代码出错时进行调试,你只需要按照题目描述实现函数即可,并不需要关心数据的实际输出格式。

\hspace{15pt}输出一行两个实数,分别为直线 AB 直线 CD 交点 P 的横纵坐标。特别的,如果两直线交点不唯一,则输出  \text{-1 -1}
\hspace{15pt}注意,只要您的答案与标准答案之差在 10^{-6} 以内,就会被认为是正确的。
示例1

输入

0 0 1 1
0 2 2 0

输出

1.000000 1.000000

说明


按照输入格式,点 A 为 (0,0)点 B 为 (1,1)点 C 为 (0,2)点 D 为 (2,0)
图中绿线表示直线 AB,红线表示直线 CD,两直线交于点 P (1,1),此时点 P 与点 B 重合。
import java.util.*;

public class Main {
    static class Point {
        public double x, y;
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
        public Point() {
            this(0.0, 0.0);
        }
    }

    static class Line {
        public Point point_A, point_B;
        public Line(Point a, Point b) {
            point_A = a;
            point_B = b;
        }
        public Line() {
            point_A = new Point();
            point_B = new Point();
        }
    }

    public static Point findMeetingPoint(Line lineA, Line lineB) {
        // TODO: 求直线 lineA 与 lineB 的交点
        Point A = lineA.point_A,B = lineA.point_B,C = lineB.point_A,D = lineB.point_B;
        double x = 0,y = 0;
        double A1 = B.y - A.y,B1 = A.x - B.x,C1 = B.x * A.y - A.x * B.y;
        double A2 = D.y - C.y,B2 = C.x - D.x,C2 = D.x * C.y - C.x * D.y;
        double den = A1 * B2 - A2 * B1;
        if(den == 0){
            return new Point(-1, -1);
        }
        x = (B1 * C2 - B2 * C1) / den;
        y = (A2 * C1 - A1 * C2) / den;
       
        return new Point(x, y);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Point A = new Point();
        A.x = scanner.nextDouble();
        A.y = scanner.nextDouble();
        Point B = new Point();
        B.x = scanner.nextDouble();
        B.y = scanner.nextDouble();
        Point C = new Point();
        C.x = scanner.nextDouble();
        C.y = scanner.nextDouble();
        Point D = new Point();
        D.x = scanner.nextDouble();
        D.y = scanner.nextDouble();
        Line AB = new Line(A, B);
        Line CD = new Line(C, D);
        Point ans = findMeetingPoint(AB, CD);
        System.out.println(ans.x + " " + ans.y);
        scanner.close();
    }
}
发表于 2025-07-10 11:29:48 回复(0)