計算幾何一 (convex Hull)
阿新 • • 發佈:2018-12-30
計算幾何一 (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
)
}
//返回的是兩倍的面積,程式碼簡潔,並且有效的避免了除法,三角函式,這些會增加計算負擔,還會引入誤差