今天写了一个很简单的判断平面坐标系两线段是否相交的算法

 

///   <summary>
///  (x1,y1) and (x2,y2) stand for beeline segment 1;
///  (x3,y3) and (x4,y4) stand for beeline segment 2.
///  This method will help us to check whether the two line segments will cross with each other.
///   </summary>
///   <returns></returns>
static   bool  IsCorssLine( double  x1,  double  y1,  double  x2,  double  y2,
                        
double  x3,  double  y3,  double  x4,  double  y4)
{
    
// we assume the beeline as 
    
// 1: y = ax + b  (y1=ax1+b, y2=ax2+b)
    
// 2: y = mx + n  (y3=mx3+n, y4=mx4+n)
     double  a, b, m, n;

    a 
=  (y1  -  y2)  /  (x1  -  x2);
    b 
=  y1  -  a  *  x1;
    m 
=  (y3  -  y4)  /  (x3  -  x4);
    n 
=  y3  -  m  *  x3;

    
if  (a  ==  m)  // means the two beelines are parallel
    {
        
return   false ;
    }

    
// now, let's get the corss point of the two lines
     double  X, Y;
    X 
=  (n  -  b)  /  (a  -  m);
    Y 
=  a  *  X  +  b;

    
// now, let's check whether (X,Y) is between (x1,y1) and (x2,y2), and between (x3,y3) and (x4,y4)
     bool  xBetweenLine1  =   false ;
    
bool  yBetweenLine1  =   false ;
    
bool  xBetweenLine2  =   false ;
    
bool  yBetweenLine2  =   false ;
    
if ( ((X  >=  x1) && (x2  >=  X))  ||  ((X  <=  x1) && (x2  <=  X)) )
    {
        xBetweenLine1 
=   true ;
    }
    
if  (((Y  >=  y1)  &&  (y2  >=  Y))  ||  ((Y  <=  y1)  &&  (y2  <=  Y)))
    {
        yBetweenLine1 
=   true ;
    }
    
if  (((X  >=  x3)  &&  (x4  >=  X))  ||  ((X  <=  x3)  &&  (x4  <=  X)))
    {
        xBetweenLine2 
=   true ;
    }
    
if  (((Y  >=  y3)  &&  (y4  >=  Y))  ||  ((Y  <=  y3)  &&  (y4  <=  Y)))
    {
        yBetweenLine2 
=   true ;
    }

    
return  xBetweenLine1  &&  yBetweenLine1  &&  xBetweenLine2  &&  yBetweenLine2;
}

转载于:https://www.cnblogs.com/xingyukun/archive/2009/02/13/1390138.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值