首页 > 代码库 > POJ 1410 判断线段与矩形交点或在矩形内
POJ 1410 判断线段与矩形交点或在矩形内
这个题目要注意的是:给出的矩形坐标不一定是按照左上,右下这个顺序的
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define eps 1e-8#define INF 1e9using namespace std;const int maxn=100;typedef struct Point{ double x,y; Point() {}; Point(double xx,double yy) { x=xx; y=yy; }} Vector;struct Line{ Point p,q; Line() {}; Line(Point pp,Point qq) { p=pp; q=qq; }};int sgn(double x){ if(fabs(x)<eps) return 0; return x<0? -1:1;}double crs_prdct(Vector a,Vector b){ return a.x*b.y-b.x*a.y;}double dot_prdct(Vector a,Vector b){ return a.x*a.y+b.x*b.y;}Vector operator - (Point a,Point b){ return Vector(a.x-b.x,a.y-b.y);}//判断点在线段上bool OnSeg(Point P,Line L){ return sgn(crs_prdct(L.p-P,L.q-P))== 0&& sgn((P.x-L.p.x)*(P.x-L.q.x))<= 0 && sgn((P.y-L.p.y)*(P.y-L.q.y))<= 0;}//-1:点在凸多边形外//0:点在凸多边形边界上//1:点在凸多边形内int inConvexPoly(Point a,Point p[],int n){ for(int i = 0; i < n; i++) { if(sgn(crs_prdct(p[i]-a,p[(i+1)%n]-a)) < 0)return -1; else if(OnSeg(a,Line(p[i],p[(i+1)%n])))return 0; } return 1;}bool inter(Line l1,Line l2){ return max(l1.p.x,l1.q.x) >= min(l2.p.x,l2.q.x) && max(l2.p.x,l2.q.x) >= min(l1.p.x,l1.q.x) && max(l1.p.y,l1.q.y) >= min(l2.p.y,l2.q.y) && max(l2.p.y,l2.q.y) >= min(l1.p.y,l1.q.y) && sgn(crs_prdct(l2.p-l1.p,l1.q-l1.p))*sgn(crs_prdct(l2.q-l1.p,l1.q-l1.p))<=0 && sgn(crs_prdct(l1.p-l2.p,l2.q-l1.p))*sgn(crs_prdct(l1.q-l2.p,l2.q-l2.p))<=0;}int main(){// freopen("in.txt","r",stdin); int t; scanf("%d",&t); Point pot[10]; while(t--) { double x1,y1,x2,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); Line li=Line(Point(x1,y1),Point(x2,y2)); scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); if(x1 > x2)swap(x1,x2); if(y1 > y2)swap(y1,y2); pot[0]=Point(x1,y1); pot[1]=Point(x2,y1); pot[2]=Point(x2,y2); pot[3]=Point(x1,y2); if(inConvexPoly(li.p,pot,4)>=0 || inConvexPoly(li.q,pot,4)>=0) { puts("T"); continue; } bool flag=false; for(int i=0; i<4; i++) { if(inter(li,Line(pot[i],pot[(i+1)%4]))) { flag=true; break; } } puts(flag? "T":"F"); } return 0;}
POJ 1410 判断线段与矩形交点或在矩形内
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。