描述
给定直线上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\n");
}else{
double x = (b0*c1 - b1*c0)/result;
double y = (a1*c0 - a0*c1)/result;
printf("(%.2f,%.2f)\n",x,y);
}
}
return 0;
}