线段相交

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264

题目:

给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。
Input
第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4。(-10^8 <= xi, yi <= 10^8)
(直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y3 | x4, y4)
Output
输出共T行,如果相交输出"Yes",否则输出"No"。
Input示例
2
1 2 2 1 0 0 2 2
-1 1 1 1 0 0 1 -1
Output示例
Yes
No


看的第一眼觉得和求两个直线是否存在交点差不多,但是好麻烦,而且应该过不了,毕竟线段和直线是有很大区别的;
然后百度了一下,觉得这篇博客讲的很好!http://blog.csdn.net/yao1373446012/article/details/51469175
所以这个题目就只要弄清楚关系别写错就能AC了!

AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
struct point
{
    double x;
    double y;
}P1,P2,Q1,Q2;
int main()
{
    double x1,y1,x2,y2,x3,y3,x4,y4;
    int t;
    cin>>t;
    while (t--)
    {
        cin>>P1.x>>P1.y>>P2.x>>P2.y>>Q1.x>>Q1.y>>Q2.x>>Q2.y;
        double sum1=(P1.x-Q1.x)*(Q2.y-Q1.y)-(P1.y-Q1.y)*(Q2.x-Q1.x);
        double sum2=(P2.x-Q1.x)*(Q2.y-Q1.y)-(P2.y-Q1.y)*(Q2.x-Q1.x);
        double sum3=(Q1.x-P1.x)*(P2.y-P1.y)-(Q1.y-P1.y)*(P2.x-P1.x);
        double sum4=(Q2.x-P1.x)*(P2.y-P1.y)-(Q2.y-P1.y)*(P2.x-P1.x);
        if (sum1*sum2<=0&&sum3*sum4<=0)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

 

posted @ 2017-10-14 19:05  你的女孩居居  阅读(174)  评论(0编辑  收藏  举报