概述
判断矩形和线段是否相交,线段在矩形内也算
前几题一直以为判断线段相交只需要跨步实验就行了,这题是个例外,因为这题相交可以是端点相交所以叉乘那里条件是 >= 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;
}
最后
以上就是清爽毛豆为你收集整理的POJ1410(线段矩形相交--坑多)的全部内容,希望文章能够帮你解决POJ1410(线段矩形相交--坑多)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复