給定兩條線段(表示為起點start =
和終點end =
),如果它們有交點,請計算其交點,沒有交點則返回空值。
要求浮點型誤差不超過10^-6
。若有多個交點(線段重疊)則返回 x 值最小的點,x 座標相同則返回 y 值最小的點。
座標絕對值不會超過2^7
,輸入的座標均是有效的二維座標。
輸入示例:line1 = ,
line2 = ,
輸出示例:
來自《程式設計師面試金典》16.03
public
double
intersection
(int
start1,
int[
] end1,
int[
] start2,
int[
] end2)
初看,是個數學的幾何問題,以為難度不大,後來仔細一想,發現不是直線的交點,是線段的交點,那麼需要考慮的特殊情況就有些多,不過只要理清思路,還是不難的。
具體思路如下:
如果不平行,那麼使用引數方程算出引數t1
和t2
,再判斷是否滿足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...