Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我有话要说!#include<stdio.h> #include<math.h> #define EPS 1e-9 //定义点 typedef struct Point { double x; double y; }Point; //定义线段 typedef struct Lineseg { Point st; Point ed; }Lineseg; //两个向量的叉积 double mult(Point a,Point b,Point c) { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } //求最大值 double MAX(double x,double y) { if(x>y) return x; return y; } //求最小值 double MIN(double x,double y) { if(x>y) return y; return x; } //判断两线段是不是相交--这也是这个题目最主要的函数 bool intersect(Lineseg u,Lineseg v) {//排斥实验 //+ //跨立实验 return MAX(u.st.x,u.ed.x)>=MIN(v.st.x,v.ed.x) && MAX(v.st.x,v.ed.x)>=MIN(u.st.x,u.ed.x) && MAX(u.st.y,u.ed.y)>=MIN(v.st.y,v.ed.y) && MAX(v.st.y,v.ed.y)>=MIN(u.st.y,u.ed.y) && mult(v.st,u.ed,u.st)*mult(u.ed,v.ed,u.st)>=0 && mult(u.st,v.ed,v.st)*mult(v.ed,u.ed,v.st)>=0; } //判断线段是不是同四边形的边相交 如果相交则返回true 否则返回 false bool judge(Point p1,Point p2,Point p3,Point p4,Lineseg l1) { Lineseg l2; l2.st=p1; l2.ed=p2; if(intersect(l1,l2)) return true; l2.st=p2; l2.ed=p3; if(intersect(l1,l2)) return true; l2.st=p3; l2.ed=p4; if(intersect(l1,l2)) return true; l2.st=p4; l2.ed=p1; if(intersect(l1,l2)) return true; return false; } int main() { int T; Lineseg l; Point p1,p2,p3,p4; double temp; scanf("%d",&T); while(T--) { scanf("%lf%lf%lf%lf",&l.st.x,&l.st.y,&l.ed.x,&l.ed.y); scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p3.x,&p3.y); /* 很重要的地方 应为它给的坐标 不一定是 x1<x3 y1>y3 我自己要转化 */ if(p1.x>p3.x) { temp=p1.x; p1.x=p3.x; p3.x=temp; } if(p1.y<p3.y) { temp=p1.y; p1.y=p3.y; p3.y=temp; } //最重要的地方 判断线段的端点是不是在四边形中 如果在肯定相交 //这样做的目的是防止线段不同四边形的边相交 但是线段的整体切在四边形中 明白了吗? // 线段在四边形中也是T 很多人是在这个地方卡到了啊 这个题目很变态的啊! if((p1.x<=l.st.x&&l.st.x<=p3.x&&p3.y<=l.st.y&&l.st.y<=p1.y)|| (p1.x<=l.ed.x&&l.ed.x<=p3.x&&p3.y<=l.ed.y&&l.ed.y<=p1.y)) { printf("T\n"); continue; } //将矩形的四个顶点分别求出来啊! //其他的不说了 很简单的啊! p2.x=p1.x; p2.y=p3.y; p4.x=p3.x; p4.y=p1.y; if(judge(p1,p2,p3,p4,l)) printf("T\n"); else printf("F\n"); } return 0; } /* 1 4 9 11 2 1 5 7 1 F */ Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator