判斷兩條線段是否相交,可以採用向量積的方式來判斷,如下圖所示:
現定義一個函數初步判斷兩線段是否相交,如下代碼:
/// <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))//點C或D在直線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上
&