POJ 1410 Intersection(判断线段与矩形位置关系)

题目链接

题目大意:判断一条线段与一个实心矩形(四条边以及中间包含的部分)是否相交。

分析:线段与矩形四条边的不规范相交(交于一条线段的端点或者重合),以及线段在矩形的内部,都算作相交。这题看似简单,其实有很多比较细节的地方,比较坑,调了好久。

#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define Clear(x) memset(x,0,sizeof(x))
#define fup(i,a,b) for(int i=a;ib;i--)
#define rfdn(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const double pi=acos(-1.0);
const int maxn = 1e2+7;
const double eps = 1e-8;

struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){x=_x;y=_y;}
};

struct Line{
    Point s,e;
    Line(){}
    Line(Point _s,Point _e){s=_s;e=_e;}
}line[10];

int sgn(double x)
{
    if(fabs(x)=0&&         //排斥实验
            sgn(max(l2.s.x,l2.e.x)-min(l1.s.x,l1.e.x))>=0&&
            sgn(max(l1.s.y,l1.e.y)-min(l2.s.y,l2.e.y))>=0&&
            sgn(max(l2.s.y,l2.e.y)-min(l1.s.y,l1.e.y))>=0&&
            sgn(cross(l2.s,l1.e,l1.s)*cross(l2.e,l1.e,l1.s)<=0)&& //跨立实验
            sgn(cross(l1.s,l2.e,l2.s)*cross(l1.e,l2.e,l2.s)<=0));
}

int main()
{
    int T;
    scanf("%d",&T);
    double x1,y1,x2,y2,x3,y3,x4,y4;
    while(T--)
    {
        Clear(line);
        int flag=0;
		double x1,y1,x2,y2;
		scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
		if(x3>x4)
			swap(x3,x4);
		if(y3x3&&max(x1,x2)y4&&max(y1,y2)

 

你可能感兴趣的:(计算几何,ACM,POJ,计算几何,线段与矩形相交)