首页 > 代码库 > 计算几何练习题――直线交点

计算几何练习题――直线交点

描述

给定直线上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;}

  

 

计算几何练习题――直线交点