凸包+凹包+凸边凹化算法
时针法
一、凸包:最大面积边界->外围边界
离散点建立最小外围边界即凸多边形,如下图所示,离散点建立凸包过程
- 判断朝外方向:向上/向下/向左/向右。· 计算最左和最右两个点,计算过这两个点的直线方程f(x)· 判断朝外方向,选取点B:
if A点是最左点:方向向左,B(Xa-1,Ya) elif A点是最右点:方向向右,B(Xa+1,Ya) else: if ya<=f(a): 方向向下,B(Xa,Ya-1) else:方向向上,B(Xa,Ya+1)
注意:向量AB逆时针旋转到向量AC和向量AD分别为θ1和θ2,但是通过夹角公式计算的的夹角总是选取最小值,即 θ1和θ3,而θ3是顺时针方向旋转的最小夹角,不满足要求,如下图所示:
所以通过夹角公式计算得到的夹角需要根据朝向方向作进一步判断,
朝向方向:
- 向上:横坐标大于点A的的点:θ=2π-arccos()=2π-θ3=θ2
向左:纵坐标大于点A的的点:θ=2π-arccos()=2π-θ3=θ2
向下:横坐标小于点A的的点:θ=2π-arccos()=2π-θ3=θ2
向右:纵坐标大于点A的的点:θ=2π-arccos()=2π-θ3=θ2
选取向量AB逆时针旋转到向量AX最小夹角对应的点X,并存入边界点集合。
step4:重复步骤2、3,直到选取的点X与初始边界点A重合停止迭代。
二、凹包:最大凹边->按序(顺时/逆时)连接所有点
思路:
step1:计算离散点的中心点R,找到距离点R最近的一个初始边界点A(Xa,Ya),存入边界点集合
step2:寻找点X使得向量RA逆时针方向旋转到向量RX的夹角最小
1、通过夹角公式计算向量RA与任意向量RX的夹角:
注意:向量RA逆时针旋转到向量RC和向量RD分别为θ1和θ2,但是通过夹角公式计算的的夹角总是选取最小值,即 θ1和θ3中选取θ3,而θ3是顺时针方向旋转的最小夹角,不满足要求。
所以通过夹角公式计算得到的夹角需要作进一步判断,
2、计算过点R和点A的直线方程f(x)=kx+b,
需要修改的点:手掌沿逆时针方向旋转时手背方向的点:
if k==0 and Xa<Xr:#平行Yd>Yr的点:θ=2π-arccos()=2π-θ3=θ2
elif k==0 and Xa>Xr:#平行Yd<Yr的点:θ=2π-arccos()=2π-θ3=θ2elif k==∞ and Ya>Yr:#垂直Xd>Xr的点:θ=2π-arccos()=2π-θ3=θ2elif k==∞ and Ya<Yr:#垂直Xd<Xr的点:θ=2π-arccos()=2π-θ3=θ2
elif k<0 and Ya>Yr:#斜线Yd>f(d)的点:θ=2π-arccos()=2π-θ3=θ2
elif k<0 and Ya<Yr:#斜线Yd<f(d)的点:θ=2π-arccos()=2π-θ3=θ2
elif k>0 and Ya>Yr:#斜线Yd<f(d)的点:θ=2π-arccos()=2π-θ3=θ2
elif k>0 and Ya<Yr:#斜线Yd>f(d)的点:θ=2π-arccos()=2π-θ3=θ2
3、 注意:若出现点C、点D和点R共线,即向量RA逆时针旋转到向量RC和向量RD的夹角相同时,选取距离中心点R最近的点,如下图所示
step2:重复步骤2,直到选取的点X与初始边界点A重合停止迭代。
三、凸边凹化
思路:
递归
step1:遍历凸边界点:
在非边界点中寻找距离凸边两边界点最近的点,存入最近点集合
step2:最近点集合中去重后并入边界点(凸边界+最近点)集合中
step3:使用凹包算法:按序(顺时/逆时)连接所有点边界点
step4:重复步骤1、2、3
结束递归条件:边界点数量==离散点数量。
凸包+凹包+凸边凹化算法相关推荐
- 二维点集求外轮廓Java_从二维点集重建平面形状-浅议凹包算法
问题背景 近期遇到一个计算几何问题,需要从点集中重建一个合理的几何形状.这个问题既有二维的也有三维的,二维的情况相对简单一点,即给出平面区域的一系列散点,求出一定程度上反映这些散点轮廓的平面多边形,给 ...
- matlab 凹包,二维点集凹包算法介绍
最近遇到一个求二维点集凹包的问题,凹包的叫法不知道是否准确,问题可以描述为:(原文下载在文章末尾) 在二维平面上有一系列的点,求能包围所有点集的二维多边形.(好像搜"离散点边界"或 ...
- 基于点云凸包的凹包获取方法
文章目录 一.简介 二.实现代码 三.实现效果 参考文献 一.简介 因为受到参考文献[1]的启发,所以尝试着在三维凸包的基础上,通过去除较大面积的三角面片来得到一个凹包(这里我们是通过指定一个面积阈值 ...
- 过滤三角网算法求取凹包(二)
文章目录 一.原理概述 二.代码实现 三.实现效果 参考文献 一.原理概述 之前写过一篇文章过滤三角网算法求取凹包,但是这个方法当时编写的有问题,后面自己又重新修改了一下,过程仍然和之前的过程相同: ...
- PCL计算ConvexHull凸包、ConcaveHull凹包
凸包凹包的概念详见 凹凸包 凸包 凹包 下面附上代码: #include <pcl/io/pcd_io.h> #include <pcl/io/vtk_io.h> #inclu ...
- 轮廓提取之滚球法、凹包算法
提示:本文章主要介绍轮廓提取算法------滚球法的运用,可用于提取点云等二维.三维数据的轮廓,以及代码框架设计. 文章目录 前言 一.基于二维点数据的模型轮廓提取算法 1.1 适用场景 1.2 问题 ...
- 计算点云的二维面积(凹包面积计算、平面旋转)
计算点云面积时,cloud compare采取的策略是将点云网格化,然后计算网格面积.这样构网的情况往往会影响到后续面积的计算精度.这里采取了一种凹包面积计算的策略.主要步骤包括: 1.将点云旋转至与 ...
- 复杂多边形光栅化算法
虽然已经一年多没有维护gbox这个图形库项目了,最近确实时间不够用... 今年的重点是把xmake彻底正好,至少在架构和大功能(包依赖管理)上,要完全落实下来,后期就是零散的维护和插件功能扩展了.. ...
- 二值化算法OTSU源码解析
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...
最新文章
- 让Windows 7揪出每一个暗中运行程序
- 怎么样重装系统后能使电脑更快?
- AI和大数据技术应用实践峰会:再谈数据破圈,智能化指引能否少走弯路?(11-25,北京)...
- 第一个structs+spring+hibernate的web程序
- 20应用统计考研复试要点(part20)--概率论与数理统计
- 前端学习(7):web的三大技术
- sylixos与harmonyOS,SylixOS 下的IO系统调用
- Android studio 简易流式布局
- protal认证的稳定性测试脚本
- 服务器终端性能测试之MBW内存测试
- 欢迎来到地狱(隐写术)
- Alphabetical list of part-of-speech tags used in the Penn Treebank Project:
- java毕业设计阿博图书馆管理系统(附源码、数据库)
- vue写一个通讯录页面
- python批量删除微信好友_我用Python找出了删除我微信的所有人并将他们自动化删除了...
- 为什么说物理大统一理论的基本完成,杨振宁据首功
- 虚拟键盘灯 软件分享
- FFT原理(基2DIT-FFT)及C语言编程思路及实现
- SE2565T-R 2.4 GHz高功率无线LAN功率放大器SKYWORKS
- java 迁移数据_Java 10迁移:轻而易举还是龙卷风?
热门文章
- php开发建站学校,闪灵CMS学校建站系统(含小程序)
- mybatis之StatementHandler
- php cms建站,Phpcms v9 建站教程-网站基本设置
- python mql4_python和mql4-女性时尚流行美容健康娱乐mv-ida网
- 使用jaxws:server 还是使用jaxws:endpoint发布webservice
- ET7.0 AssetBundle
- 提高阅读速度的一个小窍门 (Want to Read Faster? )
- 计算机一级2010教材,计算机一级2010年春第二套教材.doc
- c语言注释的嵌套,C语言嵌套注释
- Nintendo NES Zapper的工作方式以及为什么在HDTV上不起作用