`
yuanlanxiaup
  • 浏览: 858199 次
文章分类
社区版块
存档分类
最新评论

判断两条线段是否相交

 
阅读更多

判断两条线段是否相交,可以采用向量积的方式来判断,如下图所示:

现定义一个函数初步判断两线段是否相交,如下代码:

/// <summary>

/// 初步根据外围框大致判断两条线段是否相交

/// </summary>

/// <param name="line01Coords">线段1的坐标,长度为6</param>

/// <param name="line02Coords">线段2的坐标,长度为6</param>

/// <returns>返回类型为bool,如果为true表示两条线段可能相交,如果为false表示两条线段不相交</returns>

private bool JudgeAboutCrossStatus(double[] line01Coords, double[] line02Coords)

{

bool returnResult = true;

//先判断在XY方向的最值

double maxX1, minX1, maxY1, minY1;

maxX1 = minX1 = line01Coords[0];

maxY1 = minY1 = line01Coords[1];

if (line01Coords[0] < line01Coords[3])

maxX1 = line01Coords[3];

else

minX1 = line01Coords[3];

if (line01Coords[1] < line01Coords[4])

maxY1 = line01Coords[4];

else

minY1 = line01Coords[4];

double maxX2, minX2, maxY2, minY2;

maxX2 = minX2 = line02Coords[0];

maxY2 = minY2 = line02Coords[1];

if (line02Coords[0] < line02Coords[3])

maxX2 = line02Coords[3];

else

minX2 = line02Coords[3];

if (line02Coords[1] < line02Coords[4])

maxY2 = line02Coords[4];

else

minY2 = line02Coords[4];

//比较最值大小

if ((minX1 > maxX2) || (maxX1 < minX2) || (minY1 > maxY2) || (maxY1 < minY2))

{

returnResult = false;

}

return returnResult;

}

函数JudgeAboutCrossStatus()如果返回值为true则表示两条线段可能相交,则需要采用向量积的方式来判断是否相交,如果为false则表示两条线段不相交。现在定义一个函数Judge2LinesRelation ()用于判断两条线段是否相交,其代码如下:

/// <summary>

/// 判断两条线段是否相交

/// </summary>

/// <param name="line01Coords">线段1的坐标,长度为6</param>

/// <param name="line02Coords">线段2的坐标,长度为6</param>

/// <returns>返回类型为bool,如果为true表示两条线段相交,如果为false表示两条线段不相交</returns>

private bool Judge2LinesRelation(double[] line01Coords, double[] line02Coords)

{

bool returnResult = true;

returnResult = JudgeAboutCrossStatus(line01Coords, line02Coords);

if (returnResult)//初步判断两条线段可能相交

{

double BAx, BAy, BCx, BCy, BDx, BDy, BABCk, BABDk;

BAx = line01Coords[0] - line01Coords[3];

BAy = line01Coords[1] - line01Coords[4];

BCx = line02Coords[0] - line01Coords[3];

BCy = line02Coords[1] - line01Coords[4];

BABCk = BAx * BCy - BAy * BCx;

BDx = line02Coords[3] - line01Coords[3];

BDy = line02Coords[4] - line01Coords[4];

BABDk = BAx * BDy - BAy * BDx;

if (((BABCk > 0) && (BABDk > 0)) || ((BABCk < 0) && (BABDk < 0)))

{

returnResult = false;

}

else if (((BABCk > 0) && (BABDk < 0)) || ((BABCk < 0) && (BABDk > 0)))

{

double BCBDk;

BCBDk = BCx * BDy - BCy * BDx;

if (((BABDk > 0) && (BCBDk > 0)) || ((BABDk < 0) && (BCBDk < 0)))

{

returnResult = true;

}

else

{

returnResult = false;

}

}

else if ((BABCk == 0)||(BABDk==0))//CD在直线AB

{

double[] templine02Coords = new double[3];

if (BABCk == 0)//C在直线AB

{

templine02Coords[0] = line02Coords[0];

templine02Coords[1] = line02Coords[1];

templine02Coords[2] = line02Coords[2];

}

else//D在直线AB

{

templine02Coords[0] = line02Coords[3];

templine02Coords[1] = line02Coords[4];

templine02Coords[2] = line02Coords[5];

}

if (line01Coords[0] == line01Coords[3])//是否垂直,是则比较Y

{

double maxY, minY;

maxY = minY = line01Coords[1];

if (line01Coords[1] < line01Coords[4])

maxY = line01Coords[4];

else

minY = line01Coords[4];

if ((templine02Coords[1] >= minY) && (templine02Coords[1] <= maxY))//在线段上

returnResult = true;

else

returnResult = false;

}

else //比较X

{

double maxX, minX;

maxX = minX = line01Coords[0];

if (line01Coords[0] < line01Coords[3])

maxX = line01Coords[3];

else

minX = line01Coords[3];

if ((templine02Coords[0] >= minX) && (templine02Coords[0] <= maxX))//在线段上

returnResult = true;

else

returnResult = false;

}

}

}

return returnResult;

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics