2010年1月11日 星期一

TopCoder Algorithm Tutorials - 基本幾何學(2)

摘錄自:Geometry Concepts: Line Intersection and its Applications

給兩點求直線式
給線上的兩點座標(x1, y1)、(x2, y2),求它們的直線時,把直線表示成 Ax + By = C 的形式。則:
A = y2 - y1
B = x1 - x2
C = A * x1 + B * y1 (或者 A * x2 + B * y2,帶入兩點都會讓原式成立,就可以求 C)
而 -A/B 是直線的斜率。

兩線交點
若有兩線表示成:
A1x + B1y = C1
A2x + B2y = C2
先確定兩線有交點,也就是斜率不相等。
若 -A1/B1 = -A2/B2,也就是 A1*B2 = A2*B1,那麼兩條線就是平行。
確定兩條線有交點後,則交點座標就是:
x = (B2*C1 - B1*C2) / A1*B2 - A2*B1
y = (A1*C2 - A2*C1) / A1*B2 - A2*B1
公式解是由原本的兩個式子同乘 B1 後,可以消去 y 項求得 x,同乘 B2 後,可以消去 x 項求得 y。

求三點(不共線)所形成的圓
如下圖,圓心就是線段 XY 與 YZ 的中垂線交點。若直線 XY 表示成 Ax + By = C,則他的中垂線為 -Bx + Ay = D (互相垂直兩線斜率相乘等於 -1),帶入 XY 的中點可以求得 D。同樣手法找出 YZ 的中垂線,再求兩中垂線交點即為圓心。


對原點逆時針旋轉 θ 度
對點 (x, y) 沿著座標軸原點逆時針旋轉 θ 度到 (x', y'),則
x' = x cos(θ) - y sin(θ)
y' = x sin(θ) + y cos(θ)
若不是對原點的話,則先把座標軸平移(減原點座標)再套公式,之後再把座標軸平移回來。

找最大的凸多邊形(Convex Hull)
概念是:從最左邊的點開始,利用 cross product 找到順時針方向上最外圍且最接近的下一點,它就會是凸多邊形的一個頂點,把它當作下一個依據點,繞一圈回來後就會能得到凸多邊形的所有頂點。


作法是:以最左邊(最上方)的點當頂點 P,任意選一點當 N,對於剩下的其他點依序選一個當 X,找到 XP x NP 為負(表示 XP 到 NP 是順時針方向),那就把 X 當成下一個 N,如此這樣掃過一輪後,N 就會是順時針方向上最外圍且最靠近 P 的點,也就是凸多邊形的其中一個頂點,把它當成下一個 P,繼續檢查其他點。