POJ1410(线段矩形相交--坑多)

判断矩形和线段是否相交,线段在矩形内也算

前几题一直以为判断线段相交只需要跨步实验就行了,这题是个例外,因为这题相交可以是端点相交所以叉乘那里条件是 >= eps(注意这里的等号)

这就导致如果有两条线段是在同一直线上的但是没有重合部分,那么通过跨立实验返回的是相交,就错了,必须再加上快速排斥

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
const double eps = 1e-8;
double a, b, c, d, e, f, g, h;
struct Line {
    double x1, y1, x2, y2;
    Line () {}
    Line (double _x1, double _y1, double _x2, double _y2) {
        x1 = _x1; y1 = _y1; x2 = _x2; y2 = _y2;
    }
}line[5];

double cross(double x1, double y1, double x2, double y2) {
    return x1*y2 - x2*y1;
}

bool judge(double x1, double y1, double x2, double y2) {
    if (min(a,c) >= e && max(a,c) <= g && min(b,d) >= h && max(b,d) <= f) return true;
    for (int i = 1;i <= 4; i++) {
        if (min(x1,x2) <= max(line[i].x1,line[i].x2) && min(line[i].x1,line[i].x2) <= max(x1,x2)
        	&& min(y1,y2) <= max(line[i].y1,line[i].y2) && min(line[i].y1,line[i].y2) <= max(y1,y2) &&
			cross(x1-line[i].x1,y1-line[i].y1,line[i].x2-line[i].x1,line[i].y2-line[i].y1)
             * cross(line[i].x2-line[i].x1,line[i].y2-line[i].y1,x2-line[i].x1,y2-line[i].y1) >= 0
            && cross (line[i].x1-x2,line[i].y1-y2,x1-x2,y1-y2)
             * cross (x1-x2,y1-y2,line[i].x2-x2,line[i].y2-y2) >= 0)
                return true;
    }
    return false;
}

int main() {
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout); 
    int T;
    scanf("%d",&T);

    while (T--) {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h);
    
        if (e > g) swap(e, g);
        if (f < h) swap(f, h);
        line[1] = Line(e,f,g,f);
        line[2] = Line(g,f,g,h);
        line[3] = Line(e,h,g,h);
        line[4] = Line(e,f,e,h);

        if (judge(a,b,c,d)) puts("T");
        else puts("F");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/bpdwn2017/article/details/81571863