计算几何一 (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
)
}
//返回的是两倍的面积,代码简洁,并且有效的避免了除法,三角函数,这些会增加计算负担,还会引入误差