1. 程式人生 > >計算幾何一 (convex Hull)

計算幾何一 (convex Hull)

計算幾何一 (convex Hull)

B.Extreme Points

Extremity 當一個點存在一條經過它的直線,並且無法將圖形分為兩塊時,極點。

判斷極點的方法,判斷這個極點是否存在於一個三角形的內部

Make all points of S as EXTRMEE

For each triangle ▲ (p,q,r)

​ For each s ∈ S \ {p,q,r} //S集合,除p,q,r所有的數

​ If s ∈ ▲(p,q,r) then

​ mark s as NON_EXTREAM

void
extremePoint(Point S[],int n) { //O(n^4) for (int s = 0; s < n ; s ++) S[s].extreme = true; for (int p = 0; p < n ; p ++) for (int q = p+1; q < n ; q ++) for (int r = q+1; r < n ; r ++) for (int s = 0; p < n ; s ++){ if (s==p || s==q || s==r || !S[s].extreme) continue
; if (InTriangle(S[q],S[p],S[r],S[s])) S[s].extreme = false; } }

To - Left - Test (Important)

如何判斷一個點是不是在三角形內部呢?

就是To - Left - Test

如果一個點在三角形的內部,那麼這個函式返回的就是三個True或者三個False

原本的話,可以依靠解析幾何解出來,現在我們可以依靠行列式

海倫公式,給出三個點,返回面積

        s

    p       q

2
*S = | p.x p.y 1 | | q.x q.y 1 | | s.x s.y 1 | //原理
bool ToLeft (Point p,Point q,Point s)
    return Area2(p,q,s) > 0;

int Area2(Point p,Point q,Point s){
    return (
        p.x * q.y - p.y * q.x
      + q.x * s.y - q.y * s.x
      + s.x * p.y - s.y * p.x
    )
}
//返回的是兩倍的面積,程式碼簡潔,並且有效的避免了除法,三角函式,這些會增加計算負擔,還會引入誤差