pku 1410(判断线段是否跟矩形相交)

本文提供了一种算法,用于判断给定的线段是否与矩形相交,包括线段完全在矩形内的情况。通过判断线段与矩形边的相交情况以及线段端点是否在矩形内来实现这一目标。
 1 /*
 2 *  题目要求:判断线段是否跟矩形相交 
 3 *  注意:线段完全在矩形内也是相交 
 4 *  解法:分别判断线段是否跟矩形的四条边相交,再判断线段的两个端点是否都在矩形内 
 5 */
 6 
 7 #include <cstdio>
 8 #include <cstdlib>
 9 #include <iostream>
10 
11 using namespace std;
12 
13 struct point {
14     double x;
15     double y;
16 }A, B, C, D, E, F;
17 
18 double crossProd(point A, point B, point C) {
19     return (B.x-A.x)*(C.y-A.y) - (B.y-A.y)*(C.x-A.x);
20 }
21 
22 bool segIntersect(point A, point B, point C, point D) {//判断线段是否相交 
23     if (max(A.x, B.x) >= min(C.x, D.x) &&
24         max(C.x, D.x) >= min(A.x, B.x) &&
25         max(A.y, B.y) >= min(C.y, D.y) &&
26         max(C.y, D.y) >= min(A.y, B.y) &&
27         crossProd(C, D, A)*crossProd(C, B, D)>=0 &&
28         crossProd(A, B, C)*crossProd(A, D, B)>=0) return true;
29     return false;
30 }
31 
32 bool pointInRectangle(point S, point A, point B) {//判断点是否在矩形内 
33     if (max(A.x, B.x) >= S.x &&
34         min(A.x, B.x) <= S.x &&
35         max(A.y, B.y) >= S.y &&
36         min(A.y, B.y) <= S.y) return true;
37     return false;
38 }
39 
40 bool segXRectangle() {
41     if (segIntersect(A, B, C, E)) return true;//判断线段是否跟矩形的边相交 
42     else if (segIntersect(A, B, C, F)) return true;
43     else if (segIntersect(A, B, D, E)) return true;
44     else if (segIntersect(A, B, D, F)) return true;
45     if (pointInRectangle(A, C, D) && pointInRectangle(B, C, D)) return true;//判断线段的两端点是否都在矩形内 
46     return false;
47 }
48 
49 int main() {
50     int t;
51     scanf ("%d", &t);
52     while (t--) {
53         scanf ("%lf%lf%lf%lf%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y, &D.x, &D.y);
54         E.x = C.x;
55         E.y = D.y;
56         F.x = D.x;
57         F.y = C.y;
58         bool yes = segXRectangle();
59         if (yes) printf ("T\n");
60         else printf ("F\n");
61     }
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/try86/archive/2012/04/25/2469629.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值