關於如何判斷在平面上的兩條線段是否相交

2021-06-26 16:06:16 字數 3311 閱讀 8095

今天面試某公司時,被問道這道題目:

解決方法:

1.傳統判斷(這是我當時想到的答案):

*求出兩條線段所對應的直線的交點(若直線不相交,那麼線段肯定不想交)

*若有交點,則判斷該交點是否分別在兩條線段上,若符合條件,則兩條線段相交,否則不想交

這是乙個很簡單也最容易嚮導的思路,於是我試著程式設計實現,結果確實寫**時有點複雜(主要是判斷的情況太多就容易混亂)

2.演算法2:

*分別求出兩條線段所在的直線方程(斜率不存在的情況下直線方程為x-b=0)

*分別將一條線段的兩個端點座標代入另外一條線段直線方程,比如l1:ax+by+c=0,則有代入後的方程為result=ax+by+c,若是兩個端點的結果的符號相反,則肯定該線段在另外一條直線的兩側。一次將兩條線段都判斷完。

*如果結果的乘積都為負或者為0(為0代表至少有乙個端點在另外一條直線上),則代表兩條線段相交。(這裡得排除一種兩條直線重合,而線段不相交的情況)

*根據原理:若是點在直線的上方(斜率存在),或者直線左方(斜率不存在)則代入ax+by+c=0.時值為負,反之為正

這種可能剛開始比較難想到,但其實在程式設計實現時相對簡單。(最主要是感覺編寫時頭腦會更加清晰)

***主要演算法**:(我將這些功能**封裝進入了乙個judgeutils的類中)

方法1:(判斷兩條線段是否相交的函式入口為

islineintersection(linesegment l1,linesegment l2)//linesegment是乙個自定義的線段類
)

/**該類裡面是一些判斷的函式

* 所有的判斷函式全在這個類裡面

* static型函式供main方法使用

* 工具類

* */

public class judgeutils

} /**判斷兩條線段是否相交的函式*/

public static boolean islineintersection(linesegment l1,linesegment l2)

/**存在返回值,代表直線存在交點,所以進行下一步判斷,判斷交點是否在兩條線段上*/

else

}return isintersection;

} /**取得直線的交點座標的函式

* 傳入的是線段,但是裡面會將其計算為直線

* 斜率不存在的情況單獨判斷

* y=k1x+b1與y=k2x+b2進行判斷(k2!k1的情況,且斜率存在的情況)

* 解方程式x=(b1-b2)/(k2-k1)

* y=b1+k1*(b1-b2)/(k2-k1)

* */

public static point intersectionoflines(linesegment l1,linesegment l2)

else if(l2.getendp().getx()==l2.getstartp().getx())//l2的斜率不存在

}else//如果平行,判斷是否重合

else

}}//斜率不存在處理完畢

else //斜率存在時的處理方式

else//考慮重合線段

else if((l2.getendp().getx()>=l1.getstartp().getx())

&&(l2.getendp().getx()<=l1.getendp().getx()))

}else//直線平行

}} return intersection;

} /**提高**復用,將求x=b1和y=k2x+b2的交點的**封裝到乙個函式裡面

* 通過改變引數進行過載

* 返回值是乙個point型別

* */

public static point intersectionoflines(double b1,linesegment l2)

* 只需要分別判點p的x值》=l的最小的x而且p的x值<=l的最大的x

* 因為可以確定起始點x的值肯定是<=終止點x的值

* 注意,別判斷y的值,因為有可能起始點的y比結束點的y小

* 所以,只有當直線斜率不存在時才判斷y值

* */

public static boolean ispointinline(linesegment l,point p)

//斜率不存在,判斷y

else if((l.getstartp().getx()!=l.getendp().getx())

&&(p.gety()<=l.getendp().gety()&&p.gety()>=l.getstartp().gety()))

return ispointinline;

}}

方法2:

/**第二種演算法

* 分別求出兩條線段所在的直線方程,然後分別將一條線段的端點座標帶入另外一條線

*段直線方程,如果符號不同即為該線段在另外一條直線的兩側。兩條線段都判斷完後,

*即相交。

*根據:若是點在直線的上方。則代入ax+by+c=0.時值為負,在下方則為正

*若是斜率不存在,如x-b=0,點在直線右側時為證,左側時為負

* */

public class judgeutils2

} /**判斷兩條線段是否相交的函式*/

public static boolean islineintersection(linesegment l1,linesegment l2)

else

}else

}else

return isintersection;

} /**判斷點是否在直線的下方和(斜率不存在時在直線的右方的函式)返回正

* 若是點在直線的上方,或者(斜率不存在時在直線的左方)則返回-1

* 斜率存在時y=kx+b.k=(y2-y1)/(x2-x1).b=y2-k*x2.

* 斜率不存在時。x=b

* */

public static int pointbelowline(linesegment l,point p)

else if(p.getx()-b<0)

else

}else //斜率存在時

else if(k*p.getx()-p.gety()+b<0)

else

}return rvalue;

}}

完整工程路徑:

判斷平面上任意兩條線段是否相交 Python實現

判斷兩線段是否相交 步驟一 快速排斥 即判斷以兩線段為對角線的矩形是否相交,若不相交,則兩線段一定不相交 而判斷兩個矩形是否相交,只要任一矩形的最右端都大於另一矩形的最左端且任一矩形最高端大於另一矩形的最低端,則兩矩形相交 反之,若其中任一條件不滿足,兩矩形不相交。步驟二 跨立實驗 p3 若出現 p...

判斷兩條線段是否相交

如上圖,判斷線段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向量...