时针法

一、凸包:最大面积边界->外围边界

离散点建立最小外围边界即凸多边形,如下图所示,离散点建立凸包过程

思路:
step1:找到最外围的一个初始边界点A(Xa,Ya),存入边界点集合
step2:寻找点B使得向量AB方向朝外
  1. 判断朝外方向:向上/向下/向左/向右。
    · 计算最左和最右两个点,计算过这两个点的直线方程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)

step3:在点A上逆时针方向旋转向量AB,寻找点X,使得向量AB与向量AX的夹角
          最小
1、通过夹角公式计算向量AB与任意向量AX的夹角:

注意:向量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

结束递归条件:边界点数量==离散点数量。

凸包+凹包+凸边凹化算法相关推荐

  1. 二维点集求外轮廓Java_从二维点集重建平面形状-浅议凹包算法

    问题背景 近期遇到一个计算几何问题,需要从点集中重建一个合理的几何形状.这个问题既有二维的也有三维的,二维的情况相对简单一点,即给出平面区域的一系列散点,求出一定程度上反映这些散点轮廓的平面多边形,给 ...

  2. matlab 凹包,二维点集凹包算法介绍

    最近遇到一个求二维点集凹包的问题,凹包的叫法不知道是否准确,问题可以描述为:(原文下载在文章末尾) 在二维平面上有一系列的点,求能包围所有点集的二维多边形.(好像搜"离散点边界"或 ...

  3. 基于点云凸包的凹包获取方法

    文章目录 一.简介 二.实现代码 三.实现效果 参考文献 一.简介 因为受到参考文献[1]的启发,所以尝试着在三维凸包的基础上,通过去除较大面积的三角面片来得到一个凹包(这里我们是通过指定一个面积阈值 ...

  4. 过滤三角网算法求取凹包(二)

    文章目录 一.原理概述 二.代码实现 三.实现效果 参考文献 一.原理概述 之前写过一篇文章过滤三角网算法求取凹包,但是这个方法当时编写的有问题,后面自己又重新修改了一下,过程仍然和之前的过程相同: ...

  5. PCL计算ConvexHull凸包、ConcaveHull凹包

    凸包凹包的概念详见 凹凸包 凸包 凹包 下面附上代码: #include <pcl/io/pcd_io.h> #include <pcl/io/vtk_io.h> #inclu ...

  6. 轮廓提取之滚球法、凹包算法

    提示:本文章主要介绍轮廓提取算法------滚球法的运用,可用于提取点云等二维.三维数据的轮廓,以及代码框架设计. 文章目录 前言 一.基于二维点数据的模型轮廓提取算法 1.1 适用场景 1.2 问题 ...

  7. 计算点云的二维面积(凹包面积计算、平面旋转)

    计算点云面积时,cloud compare采取的策略是将点云网格化,然后计算网格面积.这样构网的情况往往会影响到后续面积的计算精度.这里采取了一种凹包面积计算的策略.主要步骤包括: 1.将点云旋转至与 ...

  8. 复杂多边形光栅化算法

    虽然已经一年多没有维护gbox这个图形库项目了,最近确实时间不够用... 今年的重点是把xmake彻底正好,至少在架构和大功能(包依赖管理)上,要完全落实下来,后期就是零散的维护和插件功能扩展了.. ...

  9. 二值化算法OTSU源码解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...

最新文章

  1. 让Windows 7揪出每一个暗中运行程序
  2. 怎么样重装系统后能使电脑更快?
  3. AI和大数据技术应用实践峰会:再谈数据破圈,智能化指引能否少走弯路?(11-25,北京)...
  4. 第一个structs+spring+hibernate的web程序
  5. 20应用统计考研复试要点(part20)--概率论与数理统计
  6. 前端学习(7):web的三大技术
  7. sylixos与harmonyOS,SylixOS 下的IO系统调用
  8. Android studio 简易流式布局
  9. protal认证的稳定性测试脚本
  10. 服务器终端性能测试之MBW内存测试
  11. 欢迎来到地狱(隐写术)
  12. Alphabetical list of part-of-speech tags used in the Penn Treebank Project:
  13. java毕业设计阿博图书馆管理系统(附源码、数据库)
  14. vue写一个通讯录页面
  15. python批量删除微信好友_我用Python找出了删除我微信的所有人并将他们自动化删除了...
  16. 为什么说物理大统一理论的基本完成,杨振宁据首功
  17. 虚拟键盘灯 软件分享
  18. FFT原理(基2DIT-FFT)及C语言编程思路及实现
  19. SE2565T-R 2.4 GHz高功率无线LAN功率放大器SKYWORKS
  20. java 迁移数据_Java 10迁移:轻而易举还是龙卷风?

热门文章

  1. php开发建站学校,闪灵CMS学校建站系统(含小程序)
  2. mybatis之StatementHandler
  3. php cms建站,Phpcms v9 建站教程-网站基本设置
  4. python mql4_python和mql4-女性时尚流行美容健康娱乐mv-ida网
  5. 使用jaxws:server 还是使用jaxws:endpoint发布webservice
  6. ET7.0 AssetBundle
  7. 提高阅读速度的一个小窍门 (Want to Read Faster? )
  8. 计算机一级2010教材,计算机一级2010年春第二套教材.doc
  9. c语言注释的嵌套,C语言嵌套注释
  10. Nintendo NES Zapper的工作方式以及为什么在HDTV上不起作用