线段相交模板

来源:互联网 发布:js给二维数组赋值 编辑:程序博客网 时间:2024/05/31 05:28
struct PT{    double x,y;//点的坐标}s[15][2];//线段的2个端点,MAX表示线段条数的上限double Min(double a,double b){    return a<b?a:b;}double Max(double a,double b){    return a>b?a:b;}double Dir(PT p1,PT p2,PT p0){    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}int OnSgm(PT p1,PT p2,PT p0){    double minx,maxx,miny,maxy;    minx=Min(p1.x,p2.x);    maxx=Max(p1.x,p2.x);    miny=Min(p1.y,p2.y);    maxy=Max(p1.y,p2.y);    return minx<=p0.x&&p0.x<=maxx&&miny<=p0.y&&p0.y<=maxy;}bool Intersect(PT p1,PT p2,PT p3,PT p4){//两线段相交有两种情况    double d1,d2,d3,d4;    d1=Dir(p4,p1,p3);    d2=Dir(p4,p2,p3);    d3=Dir(p2,p3,p1);    d4=Dir(p2,p4,p1);    if(d1*d2<0&&d3*d4<0)//两线段互相跨过        return 1;//一条直线有一个端点在另外一条直线上    if(d1==0&&OnSgm(p3,p4,p1))        return 1;    if(d2==0&&OnSgm(p3,p4,p2))        return 1;    if(d3==0&&OnSgm(p1,p2,p3))        return 1;    if(d4==0&&OnSgm(p1,p2,p4))        return 1;    return 0;//两线段不相交返回false}


0 0
原创粉丝点击