线段相交模板

结构体的嵌套会有较大的精度损失


struct PT{
    double x,y;//点的坐标
}Seg[MAX][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){//判断线段p0p2相对于线段p0p1的位置
	//向量p0p1叉乘向量p0p2,转化为行列式进行计算
	//结果若大于0,则p0p2沿顺时钟方向旋转可得到与p0p1同方向的向量
	//结果若小于0,则p0p2沿逆时钟方向旋转可得到与p0p1同方向的向量
	//结果若等于0,则p0p2与p0p1共线
    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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值