POJ 1410(计算几何初步——判断线段与矩形相交,条件恶心的一B啊,又没说清楚)

题目就是给你一个线段坐标,以及矩形的左上点,右下点(介个还要自己判断,坑爹啊,题目又木有说清楚,唉~~~~~~~)
呃。。。介个模板是自己写的
View Code
 1 #include<iostream>
2 using namespace std;
3 struct point{
4 int x, y;
5 point(){}
6 point(int _x, int _y):x(_x),y(_y){}
7 point(const point &Q):x(Q.x),y(Q.y){}
8 };
9
10 struct segment{
11 point p1, p2;
12 segment(){}
13 segment(const point &q1, const point &q2):p1(q1),p2(q2){}
14 segment(const segment &Q):p1(Q.p1),p2(Q.p2){}
15 }pol[4];//矩形的四条边
16 point p1(0,0),p2(0,0),l_t(0,0),r_b(0,0);//线段起始点及终点,以及矩形左上点,右下点。
17
18 inline int cross(point &p, point &q)//叉积
19 {
20 return q.y*p.x - p.y*q.x;
21 }
22
23 bool quick_judge(segment &Q)//快速排斥实验
24 {
25 if (max(p1.x, p2.x) < min(Q.p1.x, Q.p2.x) || min(p1.x, p2.x) > max(Q.p1.x, Q.p2.x)
26 || max(p1.y, p2.y) < min(Q.p1.y, Q.p2.y) || min(p1.y, p2.y) > max(Q.p1.y, Q.p2.y))
27 return false;
28 return true;
29 }
30
31 bool inter_judge(segment &Q)//跨立实验
32 {
33 point fir, sec, thr;
34 fir.x = p1.x - Q.p1.x;
35 fir.y = p1.y - Q.p1.y;
36 sec.x = Q.p2.x - Q.p1.x;
37 sec.y = Q.p2.y - Q.p1.y;
38 thr.x = p2.x - Q.p1.x;
39 thr.y = p2.y - Q.p1.y;
40 if (cross(fir,sec)*cross(sec,thr) >= 0) {//Q跨立P
41 fir.x = Q.p1.x - p1.x;
42 fir.y = Q.p1.y - p1.y;
43 sec.x = p2.x - p1.x;
44 sec.y = p2.y - p1.y;
45 thr.x = Q.p2.x - p1.x;
46 thr.y = Q.p2.y - p1.y;
47 if (cross(fir,sec)*cross(sec,thr) >= 0)return true;//P跨立Q;P,Q相互跨立,且通过了快速排斥实验,故必然2线段相交
48 }
49 return false;
50 }
51
52 void ini()
53 {//对线段进行初始化
54 point pol_1(r_b.x,l_t.y), pol_2(l_t.x,r_b.y);
55 pol[0].p1 = l_t; pol[0].p2 = pol_1;
56 pol[1].p1 = l_t; pol[1].p2 = pol_2;
57 pol[2].p1 = r_b; pol[2].p2 = pol_1;
58 pol[3].p1 = r_b; pol[3].p2 = pol_2;
59 }
60
61 int main()
62 {
63 int T;
64 scanf("%d",&T);
65 while (T--) {
66 scanf("%d%d%d%d%d%d%d%d",&p1.x,&p1.y,&p2.x,&p2.y,
67 &l_t.x,&l_t.y,&r_b.x,&r_b.y);
68 bool flag = true;
69 ini();
70 if (min(l_t.x,r_b.x) <= p1.x && p1.x <= max(l_t.x,r_b.x) && min(l_t.y,r_b.y) <= p1.y && p1.y <= max(r_b.y,l_t.y)
71 || min(l_t.x,r_b.x) <= p2.x && p2.x <= max(l_t.x,r_b.x) && min(l_t.y,r_b.y) <= p2.y && p2.y <= max(r_b.y,l_t.y)) {
72 cout<<"T\n";
73 continue;
74 }//判断线段是否在矩形内
75 for (int i(0); i<4; ++i) {//线段是否与矩形边相交
76 if (quick_judge(pol[i])) {
77 if (inter_judge(pol[i])) {
78 flag = false;
79 break;
80 } else continue;
81 } else continue;
82 }
83 if (!flag) {//相交
84 cout<<"T\n";
85 } else {//不相交
86 cout<<"F\n";
87 }
88 }
89 return 0;
90 }
posted on 2012-01-10 17:53  Dev-T  阅读(616)  评论(0编辑  收藏  举报