zoukankan      html  css  js  c++  java
  • POJ1410 Intersection 计算几何

    题目大意:给出一个线段的两端,和矩形两端(不一定是左上和右下),问线段是否与矩形相交(若线段在矩形内也算相交)。这题蒸鹅心……

    题目思路:判断所有情况:线段是否在矩形内,线段内一点是否在矩形内,线段是否与四边相交(叉积),线段的两端是否在矩形上,矩形的四点是否在线段上。

    要注意的是:

    1.如果两条线段的叉积为0,也可能共线但不相交。

    2.判断点在线段上的方法:叉积为0,且到两点的距离与线段等长。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #define MAXSIZE 100005
    #define INF 0x3f3f3f3f
    #define LL long long
    
    using namespace std;
    
    //给出一个线段的两端,和矩形两端(不一定是左上和右下),问线段是否与矩形相交(若线段在矩形内也算相交)。这题蒸鹅心……
    
    int px1,py1,px2,py2,lx,ly,rx,ry;
    
    int Cross(int x1,int y1,int x2,int y2,int x3,int y3)
    {
        return (x1-x2)*(y2-y3)-(x2-x3)*(y1-y2);
    }
    
    int Check(int x1,int y1,int x2,int y2)
    {
        int op1=Cross(px1,py1,x1,y1,x2,y2)*Cross(px2,py2,x1,y1,x2,y2);
        int op2=Cross(x1,y1,px1,py1,px2,py2)*Cross(x2,y2,px1,py1,px2,py2);
        if(op1<0 && op2 <0)
            return 1;
        return 0;
    }
    
    int Dist(int x1,int y1,int x2,int y2,int x3,int y3)
    {
        double d1=sqrt((x2-x1)*(x2-x1)*1.0+(y2-y1)*(y2-y1)*1.0);
        double d2=sqrt((x3-x1)*(x3-x1)*1.0+(y3-y1)*(y3-y1)*1.0);
        double d3=sqrt((x3-x2)*(x3-x2)*1.0+(y3-y2)*(y3-y2)*1.0);
        if(fabs(d1+d2-d3) < 1e-10)
            return 1;
        return 0;
    }
    
    int Solve()
    {
        //线段是否在圆内
        if(px1>=lx && px1<=rx && py1<=ly && py1>=ry)
            return 1;
        if(px2>=lx && px2<=rx && py2<=ly && py2>=ry)
            return 1;
        //四角是否在线段上
        if(Cross(lx,ly,px1,py1,px2,py2)==0 && Dist(lx,ly,px1,py1,px2,py2))
            return 1;
        if(Cross(lx,ry,px1,py1,px2,py2)==0 && Dist(lx,ry,px1,py1,px2,py2))
            return 1;
        if(Cross(rx,ry,px1,py1,px2,py2)==0 && Dist(rx,ry,px1,py1,px2,py2))
            return 1;
        if(Cross(rx,ly,px1,py1,px2,py2)==0 && Dist(rx,ly,px1,py1,px2,py2))
            return 1;
        //线段是否平行与边且覆盖
        if(Cross(px1,py1,lx,ly,lx,ry)==0 && Cross(px2,py2,lx,ly,lx,ry)==0 && Dist(lx,ly,px1,py1,px2,py2))
            return 1;
        if(Cross(px1,py1,lx,ry,rx,ry)==0 && Cross(px2,py2,lx,ry,rx,ry)==0 && Dist(lx,ry,px1,py1,px2,py2))
            return 1;
        if(Cross(px1,py1,rx,ry,rx,ly)==0 && Cross(px2,py2,rx,ry,rx,ly)==0 && Dist(rx,ry,px1,py1,px2,py2))
            return 1;
        if(Cross(px1,py1,rx,ly,lx,ly)==0 && Cross(px2,py2,rx,ly,lx,ly)==0 && Dist(rx,ly,px1,py1,px2,py2))
            return 1;
        //线段是否与矩形边相交
        if(Check(lx,ry,lx,ly))
            return 1;
        if(Check(lx,ry,rx,ry))
            return 1;
        if(Check(rx,ry,rx,ly))
            return 1;
        if(Check(rx,ly,lx,ly))
            return 1;
        return 0;
    }
    
    int main()
    {
        int T,x1,y1,x2,y2;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d%d%d%d%d%d%d",&px1,&py1,&px2,&py2,&x1,&y1,&x2,&y2);
            lx=min(x1,x2);
            ly=max(y1,y2);
            rx=max(x1,x2);
            ry=min(y1,y2);
            int op=Solve();
            if(!op)
                printf("F
    ");
            else
                printf("T
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    wordpress wp_head()函数 浏览器顶部 空白28px 解决办法
    Google Code Project中文翻译
    PNY 必恩威 4G U盘 量产
    Ubuntu安装软件方法图文指南教程
    Web开发人员必须学习的5门课程
    正则表达式
    5个音乐伴奏下载网站推荐
    卸载“一键还原精灵”后,如何删除其备份的g.文件夹?
    常用开源协议详细解析
    零命令玩转Ubuntu 8.10(准备篇)
  • 原文地址:https://www.cnblogs.com/alan-W/p/6018526.html
Copyright © 2011-2022 走看看