首页 > 试题广场 >

两直线交点

[编程题]两直线交点
  • 热度指数:8327 时间限制: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 double[] getParam(Line line) {
        double[] nums = new double[3];
        double A1 = line.point_B.y - line.point_A.y;
        double B1 = line.point_A.x - line.point_B.x;
        double C1 = -B1 * line.point_A.y + line.point_A.x * (-A1);
        nums[0] = A1;
        nums[1] = B1;
        nums[2] = C1;
        return nums;
    }
    public static Point findMeetingPoint(Line lineA, Line lineB) {
        double[] lineab = getParam(lineA);
        double[] linecd = getParam(lineB);

        //判是否有重合或平行情况d = a1*b2-a2*b1 = 0
        if (lineab[0] * linecd[1] == linecd[0] * lineab[1]) {
            return new Point(-1.00,-1.00);
        }
        //x = (b1*c2-b2*c1)/(a1*b2-a2*b1)
        double x = (lineab[1] * linecd[2] - linecd[1] * lineab[2]) /
                   (lineab[0] * linecd[1] - linecd[0] * lineab[1]);
        //y = (a2*c1-a1*c2)/(a1*b2-a2*b1)
        double y = (linecd[0] * lineab[2] - lineab[0] * linecd[2]) /
                   (lineab[0] * linecd[1] - linecd[0] * lineab[1]);
        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();
    }
}

发表于 2026-02-01 11:44:12 回复(0)
情况考虑完整
public
static Point findMeetingPoint(Line lineA, Line lineB) {
        // TODO: 求直线 lineA 与 lineB 的交点
        double x1=lineA.point_A.x,y1=lineA.point_A.y;
        double x2=lineA.point_B.x,y2=lineA.point_B.y;
        double x3=lineB.point_A.x,y3=lineB.point_A.y;
        double x4=lineB.point_B.x,y4=lineB.point_B.y;
        //一、判断是否垂线
            //1.两条垂线
        if(x2==x1&&x3==x4) return new Point(-1.0,-1.0);
       
            //2.一条垂线
        if(x2==x1&&x3!=x4){
            double k34=(y4-y3)/(x4-x3);
            double b34=y3-k34*x3;
            double y_t1=k34*x1+b34;
            return new Point(x1,y_t1);
        }
        if(x2!=x1&&x3==x4){
            double k12=(y2-y1)/(x2-x1);
            double b12=y1-k12*x1;
            double y_t2=k12*x3+b12;
            return new Point(x3,y_t2);
        }
        //二、没有垂线
        //计算两条直线斜率和截距(初中公式)
        double k12=(y2-y1)/(x2-x1);
        double k34=(y4-y3)/(x4-x3);
        double b12=y1-k12*x1;
        double b34=y3-k34*x3;
        //1.考虑平行和重合
        if(k12==k34) return new Point(-1.0,-1.0);
       
        //2.没有特殊情况:求交点(初中公式:y=k1x+b和y=k2x+b2连立起来)
        double x_final,y_final;
        x_final=(b34-b12)/(k12-k34);
        y_final=k12*x_final+b12;
        return new Point(x_final,y_final);
    }
发表于 2025-11-13 17:54:25 回复(0)
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)