POJ 1410 Intersection 判断矩形和线段相交
诶,题目太坑爹。
注意点:
1. 给出的矩形的两个点是随意的,可能是左上,右下 或 左下,右上。
2. 如果线段在矩形里面算相交;
3. 判断线段相交的模版必须完善 (考虑所有情况):共线,规范相交,非规范相交。
View Code
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define eps 10e-8 struct point { double x, y; point(){} point(double xx, double yy) : x(xx), y(yy){} }; struct seg { point a, b; seg(){} seg(point aa, point bb) : a(aa), b(bb){} }; seg pp; seg s[5]; double cross(point o ,point a, point b)//叉积 { return (a.x - o.x)*(b.y - o.y) - (a.y - o.y)*(b.x - o.x); } bool seg_cross(seg s1, seg s2)//判断两线段是否相交 { if(min(s1.a.x, s1.b.x) <= max(s2.a.x, s2.b.x) && min(s1.a.y, s1.b.y) <= max(s2.a.y, s2.b.y) && min(s2.a.x, s2.b.x) <= max(s1.a.x, s1.b.x) && min(s2.a.y, s2.b.y) <= max(s1.a.y, s1.b.y) //前4个是判断共线的时候 是否相交 && cross(s1.a, s1.b, s2.a) * cross(s1.a, s1.b, s2.b) <= 0 && cross(s2.a, s2.b, s1.a) * cross(s2.a, s2.b, s1.b) <= 0 )return 1; return 0; } bool judge()//判断线段是否在矩形里面 { if(max(pp.a.x, pp.b.x) < max(s[1].a.x, s[3].a.x) && max(pp.a.y, pp.b.y) < max(s[1].a.y, s[1].b.y) && min(pp.a.x, pp.b.x) > min(s[1].a.x, s[3].a.x) && min(pp.a.y, pp.b.y) > min(s[1].a.y, s[1].b.y) )return 1; return 0; } int main() { int cas, i, j; scanf("%d",&cas); while(cas--) { scanf("%lf%lf%lf%lf", &pp.a.x, &pp.a.y, &pp.b.x, &pp.b.y); scanf("%lf%lf%lf%lf", &s[1].a.x, &s[1].a.y, &s[3].a.x, &s[3].a.y); s[1].b.x = s[1].a.x; s[1].b.y = s[3].a.y; s[3].b.x = s[3].a.x; s[3].b.y = s[1].a.y; s[2] = seg(s[1].b, s[3].a);s[4] = seg(s[3].b, s[1].a); bool ok = 0; for(i=1;i<=4;i++) if(seg_cross(s[i], pp)){ok = 1; break;} if(judge())ok = 1; puts(ok ? "T" : "F"); } return 0; }


浙公网安备 33010602011771号