计算几何学习

凸包

凸组合, λ = < λ 1 , λ 1 , . . . , λ n > T \lambda = <\lambda_1,\lambda_1,...,\lambda_n>^T λ=<λ1,λ1,...,λn>T

其中 λ 1 + λ 2 + . . . + λ n = 1 \lambda_1+\lambda_2+...+\lambda_n = 1 λ1+λ2+...+λn=1,且 λ i ≥ 0 \lambda_i\ge0 λi0

凸包,充要条件所有极点不被包含到任何三角形。

极点,所有最外侧的点

InTriangle

三角形测试,判断点是否在一个三角形内。

伪代码

void extremePoint(Point s[],int n){
	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 ; s < n ; s++){
                    if( s == p || s == q || s== r|| !S[s].extreme) continue;
                    if(InTriangle(S[p],S[q],S[r],S[s])){
                        S[s].extreme = false;
                    }
                }
}

naïve 版本, O ( n 4 ) O(n^4) O(n4)

toLeft

判断点是否在向量的左侧或右侧

在这里插入图片描述

在三角形内,当且仅当点在三条边的左侧。

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;

极边

对凸包有贡献的边。

极边的判断,所有的点都在极边的左侧。

基于极边的判断算法,

Let EE = 空集
for each directed segment pq
	if points in S/{p,q} lie to the same side of pq then 
		let EE  = EE 并 {pq}

复杂度 O ( n ∗ ( n − 1 ) ∗ ( n − 2 ) ) O(n*(n-1)*(n-2)) O(n(n1)(n2))

void markEE(Point s[] ,int n){
    for(int k = 0 ; k < n ; k++)
        S[k].extreme = False;
    for(int p = 0; p < n ; p++){
        for(int q = p + 1 ; q < n ; q++){
            checkEdge(S,n,p,q);// 判断是否在边的一侧
        }
    }
}

void checkEdge(Point s[],int n , int p, int q){
    bool LEmpty = true, REmpty = true;
    for(int k  = 0; k < n && (LEmpty || REmpty) ; k++){
        if(k != p && k != q)
            ToLeft(S[p],S[q],S[k])?
            LEmpty = false : REmpty = false;
    }
    if(LEmpty || REmpty)
        S[p].extreme = S[q].extreme = true;
}

分治算法

典型例子,插入排序

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

都学点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值