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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值