判断两条线段是否相交

Line Intersection
http://forum.unity3d.com/threads/line-intersection.17384/

public static bool LineIntersection( Vector2 p1,Vector2 p2, Vector2 p3, Vector2 p4, ref Vector2 intersection )
{
 
    float Ax,Bx,Cx,Ay,By,Cy,d,e,f,num/*,offset*/;
 
    float x1lo,x1hi,y1lo,y1hi;
 
   
 
    Ax = p2.x-p1.x;
 
    Bx = p3.x-p4.x;
 
   
 
    // X bound box test/
 
    if(Ax<0) {
 
        x1lo=p2.x; x1hi=p1.x;
 
    } else {
 
        x1hi=p2.x; x1lo=p1.x;
 
    }
 
   
 
    if(Bx>0) {
 
        if(x1hi < p4.x || p3.x < x1lo) return false;
 
    } else {
 
        if(x1hi < p3.x || p4.x < x1lo) return false;
 
    }
 
   
 
    Ay = p2.y-p1.y;
 
    By = p3.y-p4.y;
 
   
 
    // Y bound box test//
 
    if(Ay<0) {                  
 
        y1lo=p2.y; y1hi=p1.y;
 
    } else {
 
        y1hi=p2.y; y1lo=p1.y;
 
    }
 
   
 
    if(By>0) {
 
        if(y1hi < p4.y || p3.y < y1lo) return false;
 
    } else {
 
        if(y1hi < p3.y || p4.y < y1lo) return false;
 
    }
 
   
 
    Cx = p1.x-p3.x;
 
    Cy = p1.y-p3.y;
 
    d = By*Cx - Bx*Cy;  // alpha numerator//
 
    f = Ay*Bx - Ax*By;  // both denominator//
 
   
 
    // alpha tests//
 
    if(f>0) {
 
        if(d<0 || d>f) return false;
 
    } else {
 
        if(d>0 || d<f) return false;
 
    }
 
   
 
    e = Ax*Cy - Ay*Cx;  // beta numerator//
 
   
 
    // beta tests //
 
    if(f>0) {                          
 
      if(e<0 || e>f) return false;
 
      } else {
 
      if(e>0 || e<f) return false;
 
      }
 
   
 
    // check if they are parallel
 
    if(f==0) return false;
       
    // compute intersection coordinates //
 
    num = d*Ax; // numerator //
 
//    offset = same_sign(num,f) ? f*0.5f : -f*0.5f;   // round direction //
 
//    intersection.x = p1.x + (num+offset) / f;
  intersection.x = p1.x + num / f;
 
   
 
    num = d*Ay;
 
//    offset = same_sign(num,f) ? f*0.5f : -f*0.5f;
 
//    intersection.y = p1.y + (num+offset) / f;
intersection.y = p1.y + num / f;
 
   
 
    return true;
 
}

转载于:https://www.cnblogs.com/elfnaga/p/5362574.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值