POJ 1410 Intersection 数据错误

题目要求判断一条线段和一个矩形是否相交,或者是否在矩形里面(题目好像没说?)

思路就是直接暴力判断和矩形四条边是否相交,和线段的坐标是否在矩形的坐标范围即可。

然后题目的数据,(xleft,ytop) 和 (xright,ybottom)不是按顺序给出的,需要自己判断下顺序。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 5000+20;
struct coor
{
    double x,y;
    coor(){}
    coor(double xx,double yy):x(xx),y(yy){}
    double operator ^(coor rhs) const //计算叉积(向量积)
    {
        return x*rhs.y - y*rhs.x;
    }
    coor operator -(coor rhs) const //坐标相减,a-b得到向量ba
    {
        return coor(x-rhs.x,y-rhs.y);
    }
    double operator *(coor rhs) const //数量积
    {
        return x*rhs.x + y*rhs.y;
    }
}a,b;
struct Line
{
    coor point1,point2;
    Line(){}
    Line(coor xx,coor yy):point1(xx),point2(yy){}
}line[maxn],seg;
const double eps = 1e-14;
bool same (double a,double b)
{
    return fabs(a-b)<eps;
}
bool OnSegment (coor a,coor b,coor c) //判断点C是否在线段ab上
{
    double min_x = min(a.x,b.x), min_y = min(a.y,b.y);
    double max_x = max(a.x,b.x), max_y = max(a.y,b.y);
    if (c.x>=min_x && c.x<=max_x && c.y>=min_y && c.y<=max_y) return true;
    else return false;
}
bool SegmentIntersect (coor a,coor b,coor c,coor d)
{
    double d1 = (b-a)^(d-a); //direction(a,b,d);以a为起点,计算ab和ab的叉积
    double d2 = (b-a)^(c-a);
    double d3 = (d-c)^(a-c);
    double d4 = (d-c)^(b-c);
    if (d1*d2<0 && d3*d4<0) return true;
    else if (same(d1,0) && OnSegment(a,b,d)) return true;
    else if (same(d2,0) && OnSegment(a,b,c)) return true;
    else if (same(d3,0) && OnSegment(c,d,a)) return true;
    else if (same(d4,0) && OnSegment(c,d,b)) return true;
    else return false;
}
void work ()
{
    scanf("%lf%lf%lf%lf",&seg.point1.x,&seg.point1.y,&seg.point2.x,&seg.point2.y);
    scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
    if (a.x > b.x) swap(a.x,b.x);
    if (a.y < b.y) swap(a.y,b.y);
    line[1] = Line(a,coor(b.x,a.y));
    line[2] = Line(coor(a.x,b.y),b);
    line[3] = Line(a,coor(a.x,b.y));
    line[4] = Line(coor(b.x,a.y),b);
    for (int i=1;i<=4;++i)
    {
        if (SegmentIntersect(seg.point1,seg.point2,line[i].point1,line[i].point2))
        {
            printf ("T\n");
            return ;
        }
    }
    if (seg.point1.x>=a.x&&seg.point1.x<=b.x&&seg.point2.x>=a.x&&seg.point2.x<=b.x
      &&seg.point1.y>=b.y&&seg.point1.y<=a.y&&seg.point2.y>=b.y&&seg.point2.y<=a.y)
      {
          printf ("T\n");
          return ;
      }
    printf ("F\n");
    return ;
}

int main()
{
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    int t;
    cin>>t;
    while(t--) work();
    return 0;
}

时间: 2024-10-07 22:53:32

POJ 1410 Intersection 数据错误的相关文章

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(线段相交&amp;amp;&amp;amp;推断点在矩形内&amp;amp;&amp;amp;坑爹)

Intersection 大意:给你一条线段,给你一个矩形,问是否相交. 相交:线段全然在矩形内部算相交:线段与矩形随意一条边不规范相交算相交. 思路:知道详细的相交规则之后题事实上是不难的,可是还有个坑点就是题目里明明说给的是矩形左上角跟右下角的点,但实际上不是,须要又一次推断一下...真坑. struct Point { double x, y; } A, B, C, D; struct Line { Point a, b; } L; int n; double xmult(Point p1

POJ 1410 Intersection(计算几何)

题目链接:id=1410">Intersection 推断线段与矩形的关系.与矩形相交打印T,否则打印F. 坑题,精度. . .. 思路就是,先推断 线段是否在矩形里面,再推断线段和两条对角线的关系,利用叉积模板就可以 測试数据有个坑,就是 左上角的坐标并不一定比右下角的小. ..这根本不符合题意嘛 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring&

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:

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

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

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

POJ 1410 Intersection

这题我就是用最原始的思考方法,其中有许多细节要注意.主体思想就是四条边分别和线段比较. 线段在矩形内要考虑. 我的代码有点乱有点长,其中有的部分可以写成函数. #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; int x_s,y_s,x_e,y_e,x_l,y_t,x_r,y_b; bool f1(int x) { retu

简单几何(线段相交) POJ 1410 Intersection

题目传送门 题意:一个矩形和一条线段,问是否有相交 分析:考虑各种情况.坑点:给出的矩形的两个端点是无序的,还有线段完全在矩形内也算相交 /************************************************ * Author :Running_Time * Created Time :2015/10/27 星期二 13:17:49 * File Name :POJ_1410.cpp ******************************************

poj 1410 线段相交判断

http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11329   Accepted: 2978 Description You are to write a program that has to decide whether a given line segment intersects a given rectangle. An ex