您的位置:首页 > 其它

POJ1269 Intersecting Lines

2017-02-17 16:41 253 查看

一.原题链接:

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=y1−y2

b=x2−x1

c=(x1,y1)×(x2,y2)=x1y2−x2y1

对于直线AB 、CD ,他们的参数表达式分别为a1+b1+c1=0 和 a2+b2+c2=0

由克莱姆法则,令:

D=∣∣∣a1a2b1b2∣∣∣,D1=∣∣∣−c1−c2b1b2∣∣∣,D2=∣∣∣a1a2−c1−c2∣∣∣

平行不共线: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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: