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

 

/// <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;
}
posted @ 2009-02-13 16:13  EagleFish(邢瑜琨)  阅读(4087)  评论(2编辑  收藏  举报