C-11 三角剖分的调研

C-11 三角剖分算法

图片链接:http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Thierry/thierry507webprj/complexity.htm

耳切割算法 (eat-cut) O ( n 3 ) O(n^3) O(n3)

  • 可以生成带孔多边形的算法
  • GitHub地址: https://github.com/mapbox/earcut.hpp
  • 这是生成凹多边形的算法,简单来说,凹下去的那一个顶点就是耳朵,先生成多边形的凸包,然后找到该多边形上凹下去的顶点,把那部分给“切”掉,这就是而且个算法

image-20240516135313203

#include <earcut.hpp>

// The number type to use for tessellation
using Coord = double;

// The index type. Defaults to uint32_t, but you can also pass uint16_t if you know that your
// data won't have more than 65536 vertices.
using N = uint32_t;

// 创建多边形
using Point = std::array<Coord, 2>;
std::vector<std::vector<Point>> polygon;

//放入轮廓线
polygon.push_back({{100, 0}, {100, 100}, {0, 100}, {0, 0}});
//放入洞,除了第一条线是轮廓线之外,从第二条线开始就是洞线了
polygon.push_back({{75, 25}, {75, 75}, {25, 75}, {25, 25}});

//返回索引值
std::vector<N> indices = mapbox::earcut<N>(polygon);
//读取索引值就是离散化完成的三角形了

Delaunay三角剖分算法 O ( n log ⁡ n ) O(n\log n) O(nlogn)

  • 普通的Delaunay三角剖分算法不能对带孔多边形进行三角剖分

约束Delaunay三角剖分算法 (CDT) O ( n log ⁡ n + m log ⁡ n ) O(n\log n+m\log n) O(nlogn+mlogn)

image-20240516131505621

  • CGAL几何库采用的就是这种三角剖分算法,因此无论是时间上还是稳定性上这种算法都是值得信赖的
  • 时间复杂度中的m是指轮廓边和孔洞边的数量
  • GitHub地址: https://github.com/artem-ogre/CDT
  • 算法步骤
    • 和Delaunay一样 先生成super triangle
    • 然后剔除super triangle带来的边
    • 剔除外轮廓边之外的边
    • 剔除孔洞之中的边

image-20240516165510858

image-20240516165618868

单调多边形三角化

  • 这个我也没大看懂,也没有自己代码实现过,所以不敢妄言
  • 简单的说一说就是把一个多边形分成若干个单调多边形(Monotone Polygon)。然后将单调多边形进行三角剖分
  • 单调多边形是指一个有两条链子组成的多边形,然后两条链子上的顶点的纵坐标是递增的或者横坐标是递增的。比如下面是一个y单调多边形,就是纵坐标递增。坐标相等也算递增,比如长方形也是单调多边形。
  • 这个思想就很有意思,就如同红黑树一样,介于平衡二叉树和普通二叉树之间。单调多边形就介于凸多边形和凹多边形之间。凸多边形必然是一个单调多边形,而凹多边形就不一定了。
  • 把一个多边形分成单调多边形的过程(line sweep)的时间复杂度是O(nlogn),而对一个单调多边形进行三角划分的时间复杂度是O(n);
  • https://www.cnblogs.com/dogstar/archive/2011/04/07/2008726.html 这个大佬的博客有多边形单调划分相关步骤的说明。也有单调多边形三角化的说明,可以看看
  • 在计算几何算法与应用这本书里面,也有算法的详细说明
  • 《计算几何算法与应用(第三版)》 链接:https://pan.baidu.com/s/1exLpWuD5cBcZGasWH8Y3_w 提取码:6666请添加图片描述

在这里插入图片描述
在这里插入图片描述

其他的剖分算法

参考资料

相关推荐

  1. opengl polygon 三角

    2024-07-12 04:18:04       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 04:18:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 04:18:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 04:18:04       57 阅读
  4. Python语言-面向对象

    2024-07-12 04:18:04       68 阅读

热门阅读

  1. 播放ReadableStream格式二进制流音频

    2024-07-12 04:18:04       30 阅读
  2. websocket学习

    2024-07-12 04:18:04       26 阅读
  3. Docker 安装字体文件

    2024-07-12 04:18:04       28 阅读
  4. 玩转springboot之xxxRunner接口使用

    2024-07-12 04:18:04       24 阅读
  5. Spring Security的Filter

    2024-07-12 04:18:04       27 阅读
  6. WVP后端项目文件结构

    2024-07-12 04:18:04       30 阅读
  7. 贪心算法-以学籍管理系统为例

    2024-07-12 04:18:04       26 阅读
  8. RISC-V主要指令集介绍及规则

    2024-07-12 04:18:04       27 阅读
  9. 【ChatGPT】全面解析 ChatGPT:从起源到未来

    2024-07-12 04:18:04       21 阅读