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

计算几何学习

凸包

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

分治算法

典型例子,插入排序

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python学习——对无人机影像有RGB转换到HSV
  • ecmascript和javascript的区别
  • leetcode hot100_part4_子串
  • 智能听诊器:打造宠物个性化健康生活
  • 云手机哪一款好用?手游专用云手机一览!VMOS云手机
  • Flask 第四课 -- 基本概念
  • 决策树模型的可解释性
  • 122.rk3399 uboot(2017.09) 源码分析2-initf_dm(2024-09-09)
  • 5--SpringBoot、Mybatis
  • 如何通过Python SDK获取Collection列表
  • 使用Python本地搭建http.server文件共享服务并实现公网环境远程访问——“cpolar内网穿透”
  • 大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
  • Android 进程间通信
  • QLORA:高效微调量化大型语言模型
  • pico2 开发环境搭建-基于ubuntu
  • @angular/forms 源码解析之双向绑定
  • angular学习第一篇-----环境搭建
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • gcc介绍及安装
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java的Interrupt与线程中断
  • Java反射-动态类加载和重新加载
  • js算法-归并排序(merge_sort)
  • Mybatis初体验
  • scala基础语法(二)
  • Shell编程
  • 好的网址,关于.net 4.0 ,vs 2010
  • 力扣(LeetCode)22
  • 排序(1):冒泡排序
  • 使用docker-compose进行多节点部署
  • 用Python写一份独特的元宵节祝福
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何正确理解,内页权重高于首页?
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $(selector).each()和$.each()的区别
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (done) 两个矩阵 “相似” 是什么意思?
  • (LeetCode C++)盛最多水的容器
  • (WSI分类)WSI分类文献小综述 2024
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)Dubbo快速入门、介绍、使用
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET 设计模式初探
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net6+aspose.words导出word并转pdf