您的位置:首页 > 其它

51NOD 1264 线段相交

2015-08-21 09:41 239 查看
就是判断两条线段是否相交。

要么判断MBR 要么判断跨立。



计算叉积的乘积。判断跨立。叉积的几何意义,参见matrix67大神的博客。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
//#include<list>
//#include<set>
//#include<bitset>
#include<vector>
//#include<valarray>
#include<cmath>

#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
#define sf scanf
#define pf printf
#define all(v) (v).begin(),(v).end()
#define acfun std::ios::sync_with_stdio(false)
#define DEBUG freopen("in.txt","r",stdin);\
freopen("out.txt","w",stdout);
#define SIZE (1000 +2)
#define MOD 1000000007
using namespace std;

struct point
{
    double x,y;
    point(double xx=0,double yy=0){x=xx,y=yy;}
};

inline point getvector(point a,point b)
{
    point tmp(b.x-a.x,b.y-a.y);
    return tmp;
}
inline double crossproduct(point a,point b)
{
    return a.x*b.y-a.y*b.x;
}

bool solve(point a,point b,point c,point d)
{
    point ca,cb,cd,ac,ad,ab;
    ca=getvector(c,a);
    cb=getvector(c,b);
    cd=getvector(c,d);
    ac=getvector(a,c);
    ad=getvector(a,d);
    ab=getvector(a,b);
    if(crossproduct(cd,ca)*crossproduct(cd,cb)<=0&&
       crossproduct(ac,ab)*crossproduct(ad,ab)<=0)
        return 1;
    else
        return 0;
}
int main()
{
    int t;
    sf("%d",&t);
    while(t--)
    {
        point l[4];
        FOR(i,0,4)
        sf("%lf%lf",&l[i].x,&l[i].y);
        if(solve(l[0],l[1],l[2],l[3]))
            puts("Yes");
        else
            puts("No");
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: