当前位置: 首页 > article >正文

计算几何学习

凸包

凸组合, λ = < λ 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;
}

分治算法

典型例子,插入排序


http://www.kler.cn/a/303568.html

相关文章:

  • github和Visual Studio
  • H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因
  • 《FreeRTOS任务控制块篇》
  • Java JDBC教程
  • SSE与WebSocket与MQTT
  • LeetCode59. 螺旋矩阵 II
  • 【论文阅读】视觉分割新SOTA: Segment Anything(SAM)
  • C语言 | Leetcode C语言题解之第397题整数替换
  • CSS基本布局理解(测试)——WEB开发系列38
  • 静态和动态类型语言
  • Vue入门学习笔记-表单
  • 文本分类场景下微调BERT
  • 【MySQL】敏感数据加密后如何模糊查询?
  • HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题
  • Remix 学习 - 路由模块(Route Module)
  • 利用LM-Gaussian增强稀疏视图3D重建:利用大型模型先验实现高质量场景合成
  • ZoneTree: 高性能ACID兼容的.NET有序键值数据库
  • 使用vue2+axios+chart.js画折线图 ,出现 RangeError: Maximum call stack size exceeded 错误
  • 算法提高模板LCA
  • Unity Behavior Designe 可视化有限状态机(Composites篇)
  • Docker和Docker-compose
  • LSS如何创建视锥
  • HAL库学习梳理——UART
  • HarmonyOS NEXT应用开发性能实践总结
  • 太牛了!顺丰丰语大语言模型:已应用于20余个场景
  • 数据结构实验1