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 |
Re:我日,又贴代码,还不如不说的好.In Reply To:我有话要说! Posted by:ecjtuQX at 2008-08-26 17:50:55 > #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