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

描述

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

  

 

posted @ 2016-10-13 23:15  lzyer  阅读(584)  评论(0编辑  收藏  举报