首页 > 代码库 > ac1097
ac1097
判断线段与直线的相交 这里有个地方需要注意的就是在 转换的时候容易报错 在叉积完后的判断符号的时候需要注意 这个地方会超出int 的范围
2014-06-0320:14:04
#include <iostream> #include <cstdio> #include <string.h> #include <cmath> using namespace std; struct point{ int x,y; point(int a = 0 , int b = 0){ x =a ; y = b; } }R[105]; point operator - (const point a ,const point b){ return point ( a.x - b.x , a.y - b.y ); } struct line{ point a,b; }T[ 58 ]; int n; int cross( point a, point b){ return a.x*b.y - b.x* a.y; } bool eq(point a,point b){ if(a.x == b.x&&a.y == b.y) return true; else return false; } int maxv(int a, int b){ return a>b?a:b; } int jj(int a){ if(a>0) return 1; if(a<0) return -1; else return 0; } int main() { int t ; scanf("%d",&t); while(t --){ scanf("%d",&n); int num =0 ; for( int i = 0 ; i < n ; i++){ int x1,x2,y1,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); T[i].a=point(x1,y1); T[i].b= point(x2,y2); R[num++] = T[i].a; R[num++] =T[i].b; } int ans =0; for( int i = 0 ; i <num ; ++i){ for(int j = i+1 ; j < num ; j++ ){ if(eq(R[i],R[j])) continue; int ge = 0; line an; an.a = R[i]; an.b = R[j]-an.a; for(int k = 0 ; k < n ; k ++){ int t1 =jj(cross( an.b , T[k].a - an.a )); int t2 =jj(cross( an.b , T[k].b - an.a )); if(t1 * t2 <= 0 ) ge++; } ans =maxv(ans,ge); } } printf("%d\n",ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。