计算几何基础 Intersection POJ - 1410

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/becky_w/article/details/82668361

这个题判断线段和矩形的相交情况
注意线段在矩形内部的情况

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn=100;
const double eps=1e-8;
typedef long long ll;
struct point
{
    double x,y;
    point(double _X=0,double _Y=0)
    {
        x=_X;y=_Y;
    }
    point operator - (const point &oth)const
    {
        return point(x-oth.x,y-oth.y);
    }
        point operator + (const point &oth)const
    {
        return point(x+oth.x,y+oth.y);
    }
        point operator * (const double oth)const
    {
        return point(x*oth,y*oth);
    }
        point operator / (const double oth)const
    {
        return point(x/oth,y/oth);
    }
    bool operator == (const point &oth)const
    {
        return x==oth.x&&y==oth.y;
    }
};
int dcmp(double x)
{
    if(fabs(x)<eps)return 0;
    else return x<0?-1:1;
}
double cross(point a,point b)
{
    return a.x*b.y-b.x*a.y;
}
bool segment(point a,point b,point c,point d)
{
    double c1 = cross(b-a,c-a),c2 = cross(b-a,d-a);
    double d1 = cross(d-c,a-c),d2 = cross(d-c,b-c);
    return dcmp(c1)*dcmp(c2)<0&&dcmp(d1)*dcmp(d2)<0;
}
double dot(point a,point b)
{
    return a.x*b.x+a.y*b.y;
}
bool onSegment( point p1,point p2,point p ) {
    if( (p1.x-p.x)*(p2.y-p.y)==(p2.x-p.x)*(p1.y-p.y)&&
            p.x >=min(p1.x,p2.x) && p.x <=max(p1.x,p2.x)&&
            p.y >=min(p1.y,p2.y) && p.y <=max(p1.y,p2.y)  )
        return true;
    else
        return false;
}
bool checkdot(point a,point b,point c,point d,point lst,point led)
{
    if(onSegment(lst,led,a))return false;
    if(onSegment(lst,led,b))return false;
    if(onSegment(lst,led,c))return false;
    if(onSegment(lst,led,d))return false;
    return true;
}
bool checkline(point a,point b,point c,point d,point lst,point led)
{
    if(segment(a,b,lst,led))return false;
    if(segment(b,c,lst,led)) return false;
    if(segment(c,d,lst,led)) return false;
    if(segment(d,a,lst,led)) return false;
    return true;
}
double len(point a)
{
    return  sqrt(dot(a,a));
}
double dists(point p,point a,point b)
{
    if(a==b) return len(p-a);
    point v1=b-a,v2=p-a,v3=p-b;
    if(dcmp(dot(v1,v2))<0) return len(v2);
    else if(dcmp(dot(v1,v3))>0)return len(v3);
    return fabs(cross(v1,v2))/len(v1);
}
int pointin(point p,point a[])
{
    int wn = 0,k,d1,d2;
    for(int i=1;i<=4;i++)
    {
        if(dcmp(dists(p,a[i],a[(i+1-1)%4+1]))==0)return -1;
        k = dcmp(cross(a[(i+1-1)%4+1]-a[i],p-a[i]));
        d1 = dcmp(a[i].y - p.y);
        d2 = dcmp(a[(i+1-1)%4+1].y-p.y);
        if(k>0&&d1<=0&&d2>0)wn++;
        if(k<0&&d2<=0&&d1>0)wn--;
    }
    if(wn)return 1;
    else return 0;
}
point reg[5];
int main()
{
    int n;
    scanf("%d",&n);
    int flag=0;
    for(int i=1;i<=n;i++)
    {
        flag=1;
        point lst,led;
        point a,b,c,d;
        scanf("%lf%lf%lf%lf",&lst.x,&lst.y,&led.x,&led.y);
        scanf("%lf%lf%lf%lf",&a.x,&a.y,&c.x,&c.y);
        b.x=a.x;b.y=c.y;
        d.x=c.x;d.y=a.y;
        if(!checkdot(a,b,c,d,lst,led)) flag=0;
        //cout<<flag<<" 1\n";
        if(!checkline(a,b,c,d,lst,led))flag=0;
       // cout<<flag<<" 2\n";
       reg[1]=a;reg[2]=b;reg[3]=c;reg[4]=d;
//       for(int i=1;i<=4;i++)
//       {
//           cout<<reg[i].x<<" "<<reg[i].y<<" "<<endl;
//       }
       int q1=pointin(lst,reg);
       int q2=pointin(led,reg);
//       cout<<q1<<" "<<q2<<endl;
       if(q1!=0||q2!=0) flag=0;
        if(flag) puts("F");
        else puts("T");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/becky_w/article/details/82668361