1. 程式人生 > >計算幾何基礎知識學習整理

計算幾何基礎知識學習整理

今天終於開始接觸了一下計算幾何。。這裡很多基礎題都有板子。。先簡單介紹一下計算幾何基礎概念和知識:

向量加減法:設二維向量P = ( x1, y1 ),Q = ( x2 , y2 ),則向量加法定義為: P + Q = ( x1 + x2 , y1 + y2 ),

同樣的,向量減法定義為: P - Q = ( x1 - x2 , y1 - y2 )。

顯然有性質 P + Q = Q + P,P - Q = - ( Q - P )。 

向量叉積:計算向量叉積是與直線和線段相關演算法的核心部分。

設向量P = ( x1, y1 ),Q = ( x2, y2 ),則向量叉積定義為由(0,0)、p1、p2和p1+p2所組成的平行四邊形的帶符號的面積,

即:P × Q = x1*y2 - x2*y1,

其結果是一個標量。顯然有性質 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。

一般在不加說明的情況下,本文下述演算法中所有的點都看作向量,兩點的加減法就是向量相加減,而點的乘法則看作向量叉積。

【叉積的一個非常重要性質是可以通過它的符號判斷兩向量相互之間的順逆時針關係】 
1)若 P × Q > 0 , 則P在Q的順時針方向。 
2)若 P × Q < 0 , 則P在Q的逆時針方向。 
3)若 P × Q = 0 , 則P與Q共線,但可能同向也可能反向。  

以上資料來自於:https://blog.csdn.net/reverie_mjp/article/details/51340387

判斷點是否線上段上:設點為Q,線段為P1P2 ,判斷點Q在該線段上的依據是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2為對角頂點的矩形內。前者保證Q點在直線P1P2上,後者是保證Q點不線上段P1P2的延長線或反向延長線上,對於這一步驟的判斷可以用以下過程實現: 

/*計算向量p1p2與向量p1p3的叉積,若p1p3在p1p2的逆時針方向,則返回>0,順時針方向返回<0*/
int mul(Point p1,Point p2,Point p3)
{
    return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
}

之後就是判斷線段相交了

1.快速排斥實驗。

 設以線段A1A2為對角線的矩形為R,設以對角線B1B2為對角線的矩形為T,如果R和T不想交,顯然這兩個線段不相交。

判斷矩形相交,只需判斷某一矩形是否有頂點在另一矩形內。

2. 跨立實驗。

 設向量P1=向量OA1,P2=向量OA2,Q1=向量OB1,Q2=向量OB2.

若線段A1A2跨立線段B1B2,則向量(P1-Q1)和(P2-Q1)位於向量(Q2-Q1)的兩側,

((P1-Q1) x (Q2-Q1) ) · ((P2-P1) x (Q2-Q1) ) < 0

當 (P1-Q1) x (Q2-Q1) =0 時,說明(P1-Q1) 和 (Q2-Q1) 共線,但是因為通過了快速排序實驗,所以點A1一定在B1B2上。

同理,(P2-P1) x (Q2-Q1) =0 時,所以點A2一定在B1B2上。

所以判斷線段A1A2跨立線段B1B2的依據是

( ( P1-Q1 ) x ( Q2 - Q1 ) )· (( Q1 - P2 )x ( Q2 - Q1 ) )>=0

同理,判斷線段B1B2跨立A1A2線段的依據是

 ( ( Q1-P1) x ( P2 - P1 ) )· ( ( P1 -Q2 ) x ( Q2 - Q1 ) )>=0

這張圖片非常棒 以上資料來自:https://blog.csdn.net/qq_37252519/article/details/79142029

有了這些知識可以適當接觸一下計算幾何水題了