計算幾何基礎

先介紹一些平面解析幾何的知識,可以用來解決比如判斷線段相交,判斷點在多邊形內等等問題,還有幾道題目,有興趣的自己做做:)

1. 矢量減法

設二維矢量 P = (x1,y1) ,Q = (x2,y2)
則矢量減法定義爲: P - Q = ( x1 - x2 , y1 - y2 )
顯然有性質 P - Q = - ( Q - P )
如不加說明,下面所有的點都看作矢量,兩點的減法就是矢量相減;

2.矢量叉積

設矢量P = (x1,y1) ,Q = (x2,y2)
則矢量叉積定義爲:  P × Q = x1*y2 - x2*y1   得到的是一個標量
顯然有性質 P × Q = - ( Q × P )   P × ( - Q ) = - ( P × Q )
如不加說明,下面所有的點都看作矢量,點的乘法看作矢量叉積;
叉乘的重要性質:
    >  若 P × Q  >  0 ,  則P 在Q的順時針方向
    >  若 P × Q  < 0 ,  則P 在Q的逆時針方向
    >  若 P × Q  = 0 ,  則P 與Q共線,但可能同向也可能反向

3.判斷點在線段上

設點爲Q,線段爲P1P2 ,判斷點Q在該線段上的依據是:
( Q - P1 ) × ( P2 - P1 ) = 0  且 Q 在以 P1,P2爲對角頂點的矩形內

4.判斷兩線段是否相交

我們分兩步確定兩條線段是否相交:
(1).   快速排斥試驗
設以線段 P1P2 爲對角線的矩形爲R, 設以線段 Q1Q2 爲對角線的矩形爲T,如果R和T不相
交,顯然兩線段不會相交;
(2).   跨立試驗
如果兩線段相交,則兩線段必然相互跨立對方,如圖1所示。在圖1中,P1P2跨立Q1Q2 ,則
矢量 ( P1 - Q1 ) 和( P2 - Q1 )位於矢量( Q2 - Q1 ) 的兩側,即
( P1 - Q1 ) × ( Q2 - Q1 )  *  ( P2 - Q1 ) × ( Q2 - Q1 )  <  0
上式可改寫成
    ( P1 - Q1 ) × ( Q2 - Q1 )  *  ( Q2 - Q1 ) × ( P2 - Q1 )  >   0
當  ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 時,說明   ( P1 - Q1 ) 和 ( Q2 - Q1 )共線,
但是因爲已經通過快速排斥試驗,所以 P1 一定在線段 Q1Q2上;同理,( Q2 - Q1 ) ×(
 P2 - Q1 )  = 0 說明 P2 一定在線段 Q1Q2上。
    所以判斷P1P2跨立Q1Q2的依據是:
    ( P1 - Q1 ) × ( Q2 - Q1 )  *  ( Q2 - Q1 ) × ( P2 - Q1 )  ≥  0
    同理判斷Q1Q2跨立P1P2的依據是:
    ( Q1 - P1 ) × ( P2 - P1 )  *  ( P2 - P1 ) × ( Q2 - P1 )  ≥  0
至此已經完全解決判斷線段是否相交的問題。

和上述知識有關的題目主要有:(acm.zju.edu.cn)
1280  Intersecting Lines  幾何題,求兩直線交點 
1648  Circuit Board 典型的判斷線段相交,用上面所說的叉乘
1081  Points Within 判斷點是否在多邊形內部,可以用叉乘解決,
有點麻煩,大家想一想
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章