1. 程式人生 > >【算法】計算幾何

【算法】計算幾何

線上 理解 轉化 在線 是否 多少 ros 實驗 數值

【斜率】

k=Δy/Δx

斜率為0時,直線平行於x軸(Δy=0)。

★斜率不存在時,直線平行於y軸(Δx=0)

兩點確定一條直線,所以枚舉斜率時只需要枚舉任意兩點。

eg.枚舉同一直線上的點,利用在同一直線上的點必定在其中兩個點組成的直線上的原理,只需枚舉任意兩點,再枚舉第三點是否在該直線上即可,復雜度O(1/6*n^3)。

枚舉多少直線交於一點,利用交於同一點的直線必然經過其中兩條直線相交點的原理,直接枚舉兩條直線後再枚舉第三條即可。

【向量】

向量在表示上就是點。

點積:兩個向量長度的乘積再乘上它們夾角的余弦。(結果是數值)

Dot(A,B)=Len(A)*Len(B)*cos(θ)

在平面坐標系下,Dot(A,B)=xA

xB+yAyB

點積為0時,兩向量垂直,也就是兩向量垂直當且僅當xAxB+yAyB=0

向量長度:Len(A)=sqrt(Dot(A,A))。

向量夾角:Angle(A,B)=cos(Dot(A,B)/Len(A)/Len(B))。

叉積:兩個向量組成的三角形的有向面積的兩倍,或稱平行四邊形。(結果是向量,暫不去理解方向問題)

cross(A,B)=xAyB-xByA

叉積有向,方向取決於sin(θ),順著第一個向量A看,B在左邊則叉積>0,否則<0。

特別地,如果兩向量共線(平行),叉積等於0。也就是兩向量平行當且僅當xAyB-xByA=0

所以,叉積不滿足交換律。

應用:引用自——計算幾何基礎——【點積和叉積的用處】

1:通過結果的正負判斷兩矢量之間的順逆時針關系

2:判斷折線拐向,可轉化為判斷第三點在前兩的形成直線的順逆時針方向,然後判斷拐向。

3:判斷一個點在一條直線的那一側,同樣上面的方法。

4:判斷點是否在線段上,可利用叉乘首先判斷是否共線,然後在判斷是否在其上。

5:判斷兩條直線是否相交(跨立實驗):根據判斷點在直線那一側我們可以判斷一個線段的上的兩點分別在另一個線段的兩側,然後對另一條線段也進行相同的判斷就ok。

向量旋轉:

x‘=xcosa-ysina

y‘=xsina+ycosa

【算法】計算幾何