交點 幾何判斷線段交點問題

2021-10-23 06:35:30 字數 1625 閱讀 7826

給定兩條線段(表示為起點start =和終點end =),如果它們有交點,請計算其交點,沒有交點則返回空值。

要求浮點型誤差不超過10^-6。若有多個交點(線段重疊)則返回 x 值最小的點,x 座標相同則返回 y 值最小的點。

座標絕對值不會超過2^7,輸入的座標均是有效的二維座標。

輸入示例:

line1 = ,

line2 = ,

輸出示例:

來自《程式設計師面試金典》16.03

public

double

intersection

(int

start1,

int[

] end1,

int[

] start2,

int[

] end2)

初看,是個數學的幾何問題,以為難度不大,後來仔細一想,發現不是直線的交點,是線段的交點,那麼需要考慮的特殊情況就有些多,不過只要理清思路,還是不難的。

具體思路如下:

如果不平行,那麼使用引數方程算出引數t1t2,再判斷是否滿足t1,t2屬於[0,1],屬於就有交點,算出交點,不屬於就沒有交點。

class

solution

private

voidup(

double

result,

double x,

double y)

}public

double

intersection

(int

start1,

int[

] end1,

int[

] start2,

int[

] end2)

// 判斷 (x4, y4) 是否在「線段」(x1, y1)~(x2, y2) 上if(

inside

(x1, y1, x2, y2, x4, y4)

)// 判斷 (x1, y1) 是否在「線段」(x3, y3)~(x4, y4) 上if(

inside

(x3, y3, x4, y4, x1, y1)

)// 判斷 (x2, y2) 是否在「線段」(x3, y3)~(x4, y4) 上if(

inside

(x3, y3, x4, y4, x2, y2))}

}else

}return result[0]

==integer.max_value?

newdouble

:result;

}}

我跨過山,涉過水,見過萬物復甦,周而復始,如今,山是__,水是__,萬物是__,心間一點清明,還是__。

atfwus --writing by 2020–04-12

判斷線段是否相交並求交點

設兩條線段ab和cd,其端點分別為 xa ya xb yb xc,yc xd,yd x a,y a x b,y b x c,y c x d,y d xa y a xb yb xc yc xd yd 需要判斷2條線段是否相交,若相交求交點。兩條直線所在的引數方程為 x x a alpha x b x ...

線段交(幾何問題判斷兩個線段是否有交點)

題目描述 給定n個線段。求有交點的線段對數。保證沒有兩條線段共線 輸入一行乙個整數n,表示線段的個數 第2 n 1行,每行四個實數,x1,y1,x2,y2,表示線段的兩個端點 x1,y1 和 x2,y2 輸出一行乙個整數,表示有交點的線段對數。3 0.00 0.00 1.00 1.00 0.00 1...

求兩直線交點 判斷兩線段相交 求線段交點

點的結構 struct point point double x,double y 線段的結構 struct egde egde point a,point b 建立的邊,存在的線段求兩直線 線段 交點 void getpoint point p1,point p2,point p3 point p...