一.原题链接:
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();
}
}