判断两线段是否相交
2013-05-14 15:36
211 查看
#include "stdio.h" #include<algorithm> using namespace std; struct Point { int x; int y; }; int min(int a,int b) { return a<b?a:b; } int max(int a,int b) { return a<b?b:a; } int direction(Point pa,Point pb,Point pc)//判断pc在线段(pa->pb)的哪一侧 { return (pb.x-pa.x)*(pc.y-pa.y)-(pc.x-pa.x)*(pb.y-pa.y); } bool OnSegment(Point pa,Point pb,Point pc) { return pc.x>=min(pa.x,pb.x)&&max(pa.x,pb.x)>=pc.x&&pc.y>=min(pa.y,pb.y)&&max(pa.y,pb.y)>=pc.y?true:false; } bool segmentIntersection(Point p1, Point p2,Point p3, Point p4) { int d1 = direction(p1,p2,p3); int d2 = direction(p1,p2,p4); int d3 = direction(p3,p4,p1); int d4 = direction(p3,p4,p2); //printf("%d %d %d %d\n",d1,d2,d3,d4); if(d1*d2<0&&d3*d4<0)//注意条件&& return true; else { if(d1==0&&OnSegment(p1,p2,p3)) return true; if(d2==0&&OnSegment(p1,p2,p4)) return true; if(d3==0&&OnSegment(p3,p4,p1)) return true; if(d4==0&&OnSegment(p3,p4,p2)) return true; } return false; } int main() { int n,i; Point p[5]; //FILE *fp = freopen("data.txt","r",stdin); scanf("%d",&n); while(n--) { for(i=1;i<=4;i++) { scanf("%d%d",&p[i].x,&p[i].y); } if(segmentIntersection(p[1],p[2],p[3],p[4])) printf("Intersect\n"); else printf("NoIntersect\n"); } return 0; }
相关文章推荐
- poj 2653 Pick-up sticks(判断线段是否相交)
- Segments - POJ 3304 (判断直线与线段是否相交)
- zju1648 判断两条线段是否相交
- 编程判断两个线段是否相交
- 线段 ——2D(如何判断线段是否相交)
- 判断线段是否相交的函数和求直线交点的函数
- 关于如何判断在平面上的两条线段是否相交
- zoj 1648 判断线段是否相交
- POJ - 3304 :Segments__判断直线和线段是否 相交
- poj 1039 Pipe (判断 直线和 线段 是否相交 并 求交点)
- NYOJ 1132 promise me a medal (判断两线段是否相交)
- 判断两线段是否相交-考研真题
- 2017 ACM-ICPC乌鲁木齐网络赛 B. Out-out-control cars【计算几何||判断射线与线段是否相交】
- HOJ1102 计算几何 判断两个线段是否会相交
- 判断两条线段是否相交
- 如何判断平面上两条线段(注意是线段)是否相交?(某公司校园招聘面试试题)
- C#判断线段是否相交
- Pick-up sticks(判断线段是否相交)
- 判断两条线段是否相交
- hdu 1086(判断两线段是否相交)