Codeforces #488div.2 - 994C - Two Squares(计算几何入门)

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

第一个也是很简单就容易判断的是:两个线段一旦相交就一定是YES
然后就是判断不相交但是也是YES的情况了,我们可以这样思考:
依照题意,正方形的点是按时钟顺序给出的,那么在正方形中的点就一定会被头尾依次相连的四个边向量lturn测试给出相同的正负值,所以如果16次测试为相同符号,其中一个正方形就一定在另一个正方形中间。

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int sgn(double x){
    if(fabs(x)<1e-6)return 0;
    if(x>0)return 1;
    return -1;
}
struct Point{
       double x,y;
       Point(){}
       Point(int a,int b){x=a;y=b;}
       Point operator-(const Point &b)const{
            return Point(x-b.x,y-b.y);
       }
       double operator^(const Point &b)const{
            return x*b.y-y*b.x;
       }
}A[10],B[10];
bool judge(Point &a,Point &b,Point &c,Point &d)
{
       if(!(min(a.x,b.x)<=max(c.x,d.x) && min(c.y,d.y)<=max(a.y,b.y)&&min(c.x,d.x)<=max(a.x,b.x) && min(a.y,b.y)<=max(c.y,d.y)))
       return false;
    double u,v,w,z;
    u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
       v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
       w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
       z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);
       return (u*v<=0.00000001 && w*z<=0.00000001);
}
bool js(Point &a,Point &b,Point &c){
    if(sgn((b-a)^(c-a))>=0)return 1;
    return 0;
}
int main(){
    for(int i=1;i<=4;i++){
        scanf("%lf%lf",&A[i].x,&A[i].y);
    }
    A[5]=A[1];
    for(int i=1;i<=4;i++){
        scanf("%lf%lf",&B[i].x,&B[i].y);
    }
    B[5]=B[1];
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            if(judge(A[i],A[i+1],B[j],B[j+1])){
                puts("YES");
                return 0;
            }
        }
    }
    int flag1=0,flag2=0;
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            if(js(A[j],A[j+1],B[i]))flag1++;
            else flag2++;
        }
    }
    if(flag1==16||flag2==16){
        puts("YES");
        return 0;
    }    
    flag1=0;flag2=0;
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            if(js(B[j],B[j+1],A[i]))flag1++;
            else flag2++;
        }
    }
    if(flag1==16||flag2==16){
        puts("YES");
        return 0;
    }
    puts("NO");
}

猜你喜欢

转载自blog.csdn.net/Myriad_Dreamin/article/details/80716471