POJ1269 Intersecting Lines

一.原题链接:

http://poj.org/problem?id=1269

二.题目大意:

分别给出两条直线的2个点,求出:

  • 直线平行不共线输出 NONE
  • 直线共线输出 LINE
  • 直线相交输出 POINT x y ((x,y)为交点坐标)
三.解题思路:

对于 A(x1,y1) B(x2,y2) 确定的直线 AB ,参数式为 ax+by+c=0 。有:

  • a=y1y2
  • b=x2x1
  • c=(x1,y1)×(x2,y2)=x1y2x2y1

    对于直线ABCD ,他们的参数表达式分别为 a1+b1+c1=0 a2+b2+c2=0
    由克莱姆法则,令:
    D=a1a2b1b2,D1=c1c2b1b2,D2=a1a2c1c2

  • 平行不共线: D=0

  • 共线: D=0,D1=0,D2=0 同时成立
  • 相交:交点为 (D1D,D2D)

求出直线参数再代入即可。

四.代码:
import java.util.Scanner;

class Main {
    static final int MAX_SIZE = 110;
    static class Point{
        double x, y;
    }

    //输入向量(x1, y1), (x2, y2)
    static double crossProduct(double x1, double y1, double x2, double y2){
        return x1*y2- x2*y1;
    }       

    //parameter[] ={a, b, c} 直线:ax+by+c=0
    static void getLine(Point p1, Point p2, double[]parameter){

        parameter[0] = p1.y- p2.y;
        parameter[1] = p2.x -p1.x;
        parameter[2] = p1.x*p2.y - p2.x*p1.y;

    }

    public static void main (String args[]){

        Scanner in = new Scanner(System.in);
        int test = in.nextInt();
        Point []p = new Point[4];
        for (int i = 0; i < 4; i++){
            p[i] = new Point();
        }

        double [][] parameter = new double[2][3];
        double a1, a2, b1, b2, c1, c2;
        System.out.println("INTERSECTING LINES OUTPUT");
        while(test-- != 0){
            for (int i = 0; i < 4; i++){
                p[i].x = in.nextDouble();
                p[i].y = in.nextDouble();
            }


            getLine(p[0], p[1], parameter[0]);
            getLine(p[2], p[3], parameter[1]);

            a1 = parameter[0][0];
            b1 = parameter[0][1];
            c1 = parameter[0][2];
            a2 = parameter[1][0];
            b2 = parameter[1][1];
            c2 = parameter[1][2];

            double D1 = b2*(-c1)-b1*(-c2),
                    D2 = a1*(-c2)-a2*(-c1),
                    D = a1*b2 - a2*b1;

            if (D == 0 && D1 == 0 && D2 == 0){
                System.out.println("LINE");
            } else if (D == 0){
                System.out.println("NONE");
            } else {
                double x = D1/D;
                double y = D2/D;
                System.out.printf("POINT %.2f %.2f \n", x, y);
            }
        }
        System.out.println("END OF OUTPUT");
        in.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值