51nod 1264:线段相交(计算几何)

题目链接

关于判断线段相交,具体算法见 点击打开链接 ,先进行快速排斥试验,若不能判断出两个线段不相交,再进行跨立试验。

//吐槽1,long long 会溢出。。。

//吐槽2,只进行跨立试验的虽然也可以ac,然而并不能解决两线段共直线且不相交的情况

#include
#include
#include
#include
#include
#include
using namespace std;
typedef double LL;

struct point
{
    LL x,y;
    point operator -(const point& rhs)
    {
        point ret;
        ret.x=x-rhs.x;
        ret.y=y-rhs.y;
        return ret;
    }
    LL operator *(const point& rhs)//“叉乘”
    {
        return x*rhs.y-y*rhs.x;
    }
} a[4];

bool nok1()
{
    return (max(a[0].x,a[1].x)2].x,a[3].x)||min(a[0].x,a[1].x)>max(a[2].x,a[3].x))\
           &&(max(a[0].y,a[1].y)2].y,a[3].y)||min(a[0].y,a[1].y)>max(a[2].y,a[3].y));
}
bool ok2(point a,point b,point c,point d)
{
    return ((b-a)*(c-a))*((b-a)*(d-a))<=0;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        for(int i=0; i<4; i++)
            cin>>a[i].x>>a[i].y;
        if(nok1())
            puts("No");
        else if(ok2(a[0],a[1],a[2],a[3]) && ok2(a[2],a[3],a[0],a[1]))
            puts("Yes");
        else puts("No");
    }
}

 

转载于:https://www.cnblogs.com/Just--Do--It/p/6407710.html

你可能感兴趣的:(51nod 1264:线段相交(计算几何))