描述
给定直线上L1上的两点P1,P2(P1和P2不重合)和直线L2上的两点P3,P4(P3和P4不重合),判断直线L1和L2是否相交。如果相交则需要求出交点。我们这里所说的直线相交是指有且只有一个点P,它既落在L1上又落在L2上。
输入
输入数据有多组,第一行为测试数据的组数N,下面包括2N行,每组测试数据含2行,第一行为P1,P2的坐标值,第二行为P3,P4的坐标值,比如下面的数据
1
0 0 1 1
2 2 3 3
表示P1、P2、P3、P4的坐标分别为:P1(0,0),P2(1,1),P3(2,2),P4(3,3)
输出
判断每组数据中的直线L1和L2是否相交,如果相交输出交点的坐标,并保留2位小数,如果不想交输出NO。每组数据输出占一行。注意这里的坐标格式为:
(x,y)
其中x,y为交点坐标,中间不含任何空格。
样例输入
2
0 0 1 1
2 2 3 3
0 0 1 1
0 1 1 0
样例输出
NO
(0.50,0.50)
题解:http://blog.csdn.net/abcjennifer/article/details/7584628
code:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int t; double x0,y0,x1,y1,x2,y2,x3,y3,a0,a1,b0,b1,c0,c1; cin>>t; for(int i=0; i<t; i++) { cin>>x0>>y0>>x1>>y1>>x2>>y2>>x3>>y3; a0 = y0 - y1; b0 = x1 - x0; c0 = x0*y1 - x1*y0; a1 = y2-y3; b1 = x3-x2; c1 = x2*y3-x3*y2; double result = (a0*b1 - a1*b0); if((int)result == 0) { printf("NO "); }else{ double x = (b0*c1 - b1*c0)/result; double y = (a1*c0 - a0*c1)/result; printf("(%.2f,%.2f) ",x,y); } } return 0; }