Intersection--poj1410(判断线段与矩形的关系)

http://poj.org/problem?id=1410

题目大意:给你一个线段和矩形的对角两点  如果相交就输出‘T‘  不想交就是‘F‘

注意:

1,给的矩形有可能不是左上 右下  所以要先判断的

2,线段在矩形的内部输出T

3,如果交点是矩形的顶点的话 是不相交的

情况有点多  刚开始考虑的太少   wa的我心疼

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<iostream>

using namespace std;
#define N 20
const double ESP = 1e-8;
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))

struct Point
{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y) {}
    Point operator - (const Point &temp)const
    {
        return Point(x-temp.x,y-temp.y);
    }
    int operator * (const Point &temp)const
    {
        double t=(x*temp.y)-(y*temp.x);
        if(t>ESP)
            return 1;
        if(fabs(t)<ESP)
            return 0;
        else
            return -1;
    }
} p[N],j;

Point line(Point u1,Point u2,Point v1,Point v2)///求交点模板
{
    Point ret=u1;
    double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));

    ret.x+=(u2.x-u1.x)*t;
    ret.y+=(u2.y-u1.y)*t;

    return ret;
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        j.x=j.y=INF;
        memset(p,0);
        double x1,x2,y1,y2;
        double a,b,c,d;
        scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
        scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
        if(a>c)
            swap(a,c),swap(b,d);
        int u,D;
        u=max(b,d);
        D=min(b,d);
        if(x1>=a && x1<=c && x2>=a && x2<=c && y1>=D && y1<=u && y2>=D && y2<=u)
        {
            printf("T\n");
            continue;
        }
        ///判断线段与矩形的一条边是否相交
        p[1]=Point(x1,y1);
        p[2]=Point(x2,y2);
        p[3]=Point(a,b);
        p[4]=Point(c,b);
        p[5]=Point(c,b);
        p[6]=Point(c,d);
        p[7]=Point(a,b);
        p[8]=Point(a,d);
        p[9]=Point(a,d);
        p[10]=Point(c,d);
        int k,kk;
        int flag=0;
        for(int i=2; i<=5; i++)
        {
            k=abs((p[1]-p[i*2-1])*(p[i*2]-p[i*2-1])+(p[2]-p[i*2-1])*(p[i*2]-p[i*2-1]));
            kk=abs((p[i*2-1]-p[1])*(p[2]-p[1])+(p[i*2]-p[1])*(p[2]-p[1]));
            if(k!=2 && kk!=2)///如果相交
            {
                if((p[1]-p[i*2-1])*(p[i*2]-p[i*2-1])==0 && (p[2]-p[i*2-1])*(p[i*2]-p[i*2-1])==0)///共线
                {
                    if(i==2 || i==5)
                    {
                        if((p[1].x>a && p[1].x<c)||(p[2].x>a && p[2].x<c) || (p[1].x<=a && p[2].x>=c) || (p[2].x<=a && p[1].x>=c))
                        {
                            flag=1;
                            break;
                        }
                    }
                    else
                    {
                        if((p[1].y>D && p[1].y<u)||(p[2].y>D && p[2].y<u) || (p[1].y<=D && p[2].y>=u) || (p[2].y<=D && p[1].y>=u))
                        {
                            flag=1;
                            break;
                        }
                    }
                }
                j=line(p[1],p[2],p[i*2],p[i*2-1]);
                if(i==2)
                if(j.x>a && j.x<c && j.y==b)///如果交点在a和c之间(不包括a c)
                {
                    flag=1;
                    break;
                }
                if(i==3)
                {
                    if(j.x==c && j.y>D && j.y<u)
                    {
                        flag=1;
                        break;
                    }
                }
                if(i==4)
                {
                    if(j.x==a && j.y>D && j.y<u)
                    {
                        flag=1;
                        break;
                    }
                }
                if(i==5)
                {
                    if(j.x>a && j.x<c && j.y==d)
                    {
                        flag=1;
                        break;
                    }
                }
            }
        }
        if(flag==0)
            printf("F\n");
        else
            printf("T\n");
    }
    return 0;
}
时间: 2024-11-14 15:28:31

Intersection--poj1410(判断线段与矩形的关系)的相关文章

poj1410(判断线段和矩形是否相交)

题目链接:https://vjudge.net/problem/POJ-1410 题意:判断线段和矩形是否相交. 思路:注意这里的相交包括线段在矩形内,因此先判断线段与矩形的边是否相交,再判断线段的两端点是否在矩形内(因为是矩形,即凸多边形,直接用叉积判断即可,如果是一般的多边形,需要用射线法判断.) AC code: #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib>

poj 1410 Intersection (判断线段与矩形相交 判线段相交)

题目链接 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12040   Accepted: 3125 Description You are to write a program that has to decide whether a given line segment intersects a given rectangle. An example: line: start point:

判断线段和矩形是否相交

package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; [SWF(width=375,height=300,backgroundColor="0xeeeeee")] public class RectLine extends Sprite { private var txt:TextField; public function RectLine

POJ 1410 判断线段与矩形交点或在矩形内

这个题目要注意的是:给出的矩形坐标不一定是按照左上,右下这个顺序的 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define eps 1e-8 #define INF 1e9 using namespace std; const int maxn=100; typedef struct Point {

POJ 1410 Intersection(线段相交&amp;&amp;判断点在矩形内&amp;&amp;坑爹)

Intersection 大意:给你一条线段,给你一个矩形,问是否相交. 相交:线段完全在矩形内部算相交:线段与矩形任意一条边不规范相交算相交. 思路:知道具体的相交规则之后题其实是不难的,但是还有个坑点就是题目里明明说给的是矩形左上角跟右下角的点,但实际上不是,需要重新判断一下...真坑. 1 struct Point 2 { 3 double x, y; 4 } A, B, C, D; 5 struct Line 6 { 7 Point a, b; 8 } L; 9 10 int n; 11

POJ 1410 Intersection (线段和矩形相交)

题目: Description You are to write a program that has to decide whether a given line segment intersects a given rectangle. An example: line: start point: (4,9) end point: (11,2) rectangle: left-top: (1,5) right-bottom: (7,1)  Figure 1: Line segment doe

Jack Straws(判断线段是否相交 + 并查集)

/** http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1840  题意: 判断线段是否相交  (包括间接相交) 输入: N(代表有n条线段) sx  sy  ex  ey(一条直线的两端点的坐标) : : : a b(判断第a条和第b条线段是否相交) : : : 0 0输入0 0 询问结束 输出:若相交输出  CONNECTED 否则         NOT CONNECTED */ #includ

POJ 1410 Intersection --几何,线段相交

题意: 给一条线段,和一个矩形,问线段是否与矩形相交或在矩形内. 解法: 判断是否在矩形内,如果不在,判断与四条边是否相交即可.这题让我发现自己的线段相交函数有错误的地方,原来我写的线段相交函数就是单纯做了两次跨立实验,在下图这种情况是错误的: 这样的话线段与右边界的两次跨立实验(叉积<=0)都会通过,但是并不相交. 所以要加快速排斥. 还有就是这题题目说给出的不一定是左上角,右下角依次的顺序.所以干脆重新自己定义左上角,右下角. 代码: #include <iostream> #inc

zoj 1010 Area 判断线段是否相交(把线段扩充一倍后 好处理) + 多边形求面积

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10 题意:  给定n个点的, 如果这n个点不能形成多边形 以及 n < 3 时, 输出, "Impossible",  否则 输出 多边形的面积. 分析: 这题主要在 分析  n 个点 是否形成 多边形.  枚举 每条边,  看 这条边 是否与 其他 n - 3 条边 不规范相交. (当处理 其他 边时, 我们采用 扩充线段一倍) 代码如下: con