判斷兩條線段是否相交

2022-02-16 09:28:16 字數 3591 閱讀 3368

現定義乙個函式初步判斷兩線段是否相交,如下**:

///

/// 初步根據外圍框大致判斷兩條線段是否相交

///

/// 線段1的座標,長度為6

/// 線段2的座標,長度為6

/// 返回型別為bool,如果為true表示兩條線段可能相交,如果為false表示兩條線段不相交

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 ()用於判斷兩條線段是否相交,其**如下:

///

/// 判斷兩條線段是否相交

///

/// 線段1的座標,長度為6

/// 線段2的座標,長度為6

/// 返回型別為bool,如果為true表示兩條線段相交,如果為false表示兩條線段不相交

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上

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];

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];

returnresult = true;

else

returnresult = false;

return returnresult;

}

判斷兩條線段是否相交

如上圖,判斷線段ab和線段cd相交。分析 如果線段ab和線段cd相交,只能是圖中的兩種相交情況。可以用向量叉乘來判斷。如果 向量ab叉乘向量ac 向量ab叉乘向量ad 0 並且 向量cd叉乘向量ca 向量cd叉乘向量cb 0,那麼說明線段ab與線段cd相交。設a x1,y1 b x2,y2 c x3...

判斷兩條線段是否相交

題目 給定兩條線段,判斷這兩條線段是否相交,線段ab的表示形式是a x1,y1 b x2,y2 線段cd的表示形式為c x3,y3 d x4,y4 那麼我們如何判斷線段ab與線段cd是否相交。解析 在介紹如何解決線段相交問題之前,我們先介紹向量的叉積。如下圖所示 下面的圖 1 表示p1向量在p2向量...

判斷兩條線段是否相交

1.必備知識 向量積 矢積 與數量積 標積 的區別 名稱標積 內積 數量積 點積 矢積 外積 向量積 叉積 表示式 a,b和c粗體字,表示向量 a b a b cos a b c,其中 c a b sin c的方向遵守右手定則 幾何意義 向量a在向量b方向上的投影與向量b的模的乘積 c是垂直a b所...