-
2019-06-07 17:53:19
本项目的部分代码参考自下面博客
https://www.cnblogs.com/lan-yt/p/9200621.html
最近项目中涉及到使用Unity3D来进行地图上国家的渲染,比如把中国圈起来染成红色的这样的需求。
Unity3D把区域渲染是用的MeshRender,关于MeshRender的用法我就不详细讲解了。
最终问题卡在一个点上,对于中国边界这样的凹多边形,如何将其剖分为一系列三角形。
本来以为这是个最常见的问题,应该会有很多求解方法的,结果我找了半天,就找到了上面给出网址的那个博客,而没找到成形的源码。
还好那个博客上有代码,就按照那个博客上的代码,运行了一下,反正在我电脑上有点小的BUG。
不过这个BUG很容易修改,虽然我忘记我是怎么修改的了,后来运行成功了。
于是,我就找到中国边界数据,把它读进去,然后运行。
等了一会儿,系统爆栈了,因为那个博客中算法用到了递归,而中国边界有八千多个点,一个点递归一次,需要递归八千次。
不得已,只好自己写代码了。
后来看到了一个翻译来自日本的凹多边形剖分算法,耳切法。
博客地址:
https://blog.csdn.net/u010019717/article/details/52753855
根据第二个博客中的思想,来设计如下算法:
步骤一:将多边形的所有点读入数组V中。
步骤二:判断该多边形是否为凸多边形,如果为凸多边形,按照凸多边形剖分算法进行处理,算法结束,否则转到步骤三。
步骤三:将所有顶点的序号读入一个数组A中保存起来,然后遍历多边形的顶点,判断每个顶点是否为“耳朵节点”,然后将所有“耳朵节点”保存到数组B。
步骤四:如果耳朵节点数组B为空或者顶点数组V的顶点数组小于三,则算法结束。否则,取出耳朵节点中的第一个顶点P来。
步骤五:找到该节点的前序节点M和后序节点N,这三个点MPN组成一个三角形,保存到结果数组R中,然后,把当前顶点P从耳朵节点中去掉,从数组V中去掉,从序号数组B中去掉。
步骤六:前序节点M和后序节点N,成为了“耳朵节点”的候选。则分别判断M与N是不是耳朵节点,如果是耳朵节点,且没有在当前的耳朵节点数组B中,则将判断为耳朵节点的点放入耳朵节点数组B中。
步骤七:跳转到步骤四。
然后通过以上算法,就得到了最终的结果,这个算法没有使用递归,算法的效率还行。
这个是我算法运行的结果。
算法源码:
https://download.csdn.net/download/kongxinyue/11230469
更多相关内容 -
简单多边形的三角剖分算法
2013-12-17 19:17:01采用C#语言实现计算几何中简单多边形的三角剖分算法。内容包含源程序,可执行程序,程序运行说明文档和参考图。 -
C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码
2022-05-18 20:59:28最小代价多边形三角剖分 凸多边形的三角剖分是通过在非相邻顶点(角点)之间绘制对角线来形成的,这样对角线就不会相交。问题是如何以最小的代价找到三角剖分的代价。三角剖分的代价是其组成三角形的权重之和。每个...最小代价多边形三角剖分
凸多边形的三角剖分是通过在非相邻顶点(角点)之间绘制对角线来形成的,这样对角线就不会相交。问题是如何以最小的代价找到三角剖分的代价。三角剖分的代价是其组成三角形的权重之和。每个三角形的重量是其周长(所有边的长度之和)
请参阅以下来源的示例。
多项式三角
同一凸五边形的两个三角剖分。左侧的三角测量的成本为8+2√2+2√5(约15.30),右侧的成本为4+2√2 + 4√5(约15.77)。
建议:在继续解决方案之前,请先在{IDE}上尝试您的方法。
该问题具有递归子结构。其思想是将多边形分为三部分:单个三角形、左侧的子多边形和右侧的子多边形。我们尝试所有可能的分割,像这样,找到一个最小化三角形成本加上两个子多边形三角剖分成本的分割。设顶点从i到j的三角剖分的最小代价为最小代价(i,j)
如果j<=i+2,则
最小成本(i,j)=0
其他的
最小成本(i,j)=最小{最小成本(i,k)+最小成本(k,j)+成本(i,k,j)}
这里k从“i+1”到“j-1”变化
由边(i,j)、(j,k)和(k,i)形成的三角形的成本为
成本(i,j,k)=距离(i,j)+距离(j,k)+距离(k,i)
源程序
using System; using System.Collections; using System.Collections.Generic; using Legalsoft.Truffer.TGraph; namespace Legalsoft.Truffer.Algorithm { public static partial class Algorithm_Gallery { public static double MCPT_Solve(TPoint[] vertices, int i, int j) { if (j < (i + 2)) { return 0; } double cost = float.MaxValue; for (int k = i + 1; k <= j - 1; k++) { double weight = vertices[i].Distance(vertices[j]) + vertices[j].Distance(vertices[k]) + vertices[k].Distance(vertices[i]); cost = Math.Min(cost, weight + MCPT_Solve(vertices, i, k) + MCPT_Solve(vertices, k, j)); } return cost; } private static double MCPT_Cost(TPoint[] points, int i, int j, int k) { TPoint p1 = points[i]; TPoint p2 = points[j]; TPoint p3 = points[k]; return TPoint.Distance(p1, p2) + TPoint.Distance(p2, p3) + TPoint.Distance(p3, p1); } public static double MCPT_Solve(TPoint[] points, int n) { if (n < 3) { return 0; } double[,] table = new double[n, n]; for (int gap = 0; gap < n; gap++) { for (int i = 0, j = gap; j < n; i++, j++) { if (j < i + 2) { table[i, j] = 0.0; } else { table[i, j] = 1000000.0; for (int k = i + 1; k < j; k++) { double val = table[i, k] + table[k, j] + MCPT_Cost(points, i, j, k); if (table[i, j] > val) { table[i, j] = val; } } } } } return table[0, n - 1]; } } }
-
多边形三角剖分(c++,ue4)
2017-03-20 21:54:32如何将一个多边形三角化是三维模型中一个比较常见的问题。最初的想法很简单,认为就是以一个点起点连接和它不相邻的点所有三角形就区分完了。这样写完后放到ue4里面测试,开始比较顺利,当但遇到凹多边形时,就发现... -
复杂多边形的三角剖分
2021-06-19 17:34:34详细介绍了通过CGAL对复杂多边形进行三角剖分的过程。1. 概述
1.1. 多边形分类
需要首先明确的是多边形的分类,第一种是最简单的凸多边形:
凸多边形的每个内角都是锐角或钝角,这种多边形最普通也最常见。如果至少存在一个角是优角(大于180度小于360度),那么就是凹多边形了:
以上多边形有一个共同特征就是由单个环线的边界组成。如果存在一个外环和多个内环组成多边形,那么就是带洞多变形了:
如上图所示的多边形是由一个外环和两个内环组成的,两个内环造成了外环多边形的孔洞,也就是带洞多边形了。
1.2. 三角剖分
三角剖分也叫做三角化,或者分格化(tessellation/triangulation),将复杂的多边形剖分成多个三角形。这在图形学上有非常多的好处,便于绘制和计算。这类算法往往与Delaunay三角网算法相关,多边形的边界作为Delaunay三角网的边界约束,从而得到比较好的三角网。
2. 详论
我曾经在《通过CGAL将一个多边形剖分成Delaunay三角网》这篇文章中,通过CGAL实现了一个多边形的剖分,不过这个文章介绍的算法内容不支持凹多边形和带洞多边形(这也是很多其他算法实现的问题)。所以我继续翻了CGAL的官方文档,在《2D Triangulation》这一章中确实介绍了带洞多边形的三角剖分的案例。由于带洞多边形最复杂,那么我通过这个案例,来实现一下带洞多边形的三角剖分。
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Constrained_Delaunay_triangulation_2.h> #include <CGAL/Triangulation_face_base_with_info_2.h> #include <CGAL/Polygon_2.h> #include <iostream> #include <gdal_priv.h> #include <ogrsf_frmts.h> struct FaceInfo2 { FaceInfo2() {} int nesting_level; bool in_domain() { return nesting_level % 2 == 1; } }; typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Triangulation_vertex_base_2<K> Vb; typedef CGAL::Triangulation_face_base_with_info_2<FaceInfo2, K> Fbb; typedef CGAL::Constrained_triangulation_face_base_2<K, Fbb> Fb; typedef CGAL::Triangulation_data_structure_2<Vb, Fb> TDS; typedef CGAL::Exact_predicates_tag Itag; typedef CGAL::Constrained_Delaunay_triangulation_2<K, TDS, Itag> CDT; typedef CDT::Point Point; typedef CGAL::Polygon_2<K> Polygon_2; typedef CDT::Face_handle Face_handle; void mark_domains(CDT& ct, Face_handle start, int index, std::list<CDT::Edge>& border) { if (start->info().nesting_level != -1) { return; } std::list<Face_handle> queue; queue.push_back(start); while (!queue.empty()) { Face_handle fh = queue.front(); queue.pop_front(); if (fh->info().nesting_level == -1) { fh->info().nesting_level = index; for (int i = 0; i < 3; i++) { CDT::Edge e(fh, i); Face_handle n = fh->neighbor(i); if (n->info().nesting_level == -1) { if (ct.is_constrained(e)) border.push_back(e); else queue.push_back(n); } } } } } //explore set of facets connected with non constrained edges, //and attribute to each such set a nesting level. //We start from facets incident to the infinite vertex, with a nesting //level of 0. Then we recursively consider the non-explored facets incident //to constrained edges bounding the former set and increase the nesting level by 1. //Facets in the domain are those with an odd nesting level. void mark_domains(CDT& cdt) { for (CDT::Face_handle f : cdt.all_face_handles()) { f->info().nesting_level = -1; } std::list<CDT::Edge> border; mark_domains(cdt, cdt.infinite_face(), 0, border); while (!border.empty()) { CDT::Edge e = border.front(); border.pop_front(); Face_handle n = e.first->neighbor(e.second); if (n->info().nesting_level == -1) { mark_domains(cdt, n, e.first->info().nesting_level + 1, border); } } } int main() { //创建三个不相交的嵌套多边形 Polygon_2 polygon1; polygon1.push_back(Point(-0.558868038740926, -0.38960351089588)); polygon1.push_back(Point(2.77833686440678, 5.37465950363197)); polygon1.push_back(Point(6.97052814769976, 8.07751967312349)); polygon1.push_back(Point(13.9207400121065, 5.65046156174335)); polygon1.push_back(Point(15.5755523607748,-1.98925544794189)); polygon1.push_back(Point(6.36376361985472, -6.18144673123487)); Polygon_2 polygon2; polygon2.push_back(Point(2.17935556413387, 1.4555590039808)); polygon2.push_back(Point(3.75630057749723, 4.02942327866582)); polygon2.push_back(Point(5.58700685737883, 4.71820385921534)); polygon2.push_back(Point(6.54767450919789, 1.76369768475295)); polygon2.push_back(Point(5.71388749063795, -0.900795613688593)); polygon2.push_back(Point(3.21252643495814, -0.320769861646896)); Polygon_2 polygon3; polygon3.push_back(Point(7.74397762278389, 0.821155837685192)); polygon3.push_back(Point(9.13966458863422, 4.24693293568146)); polygon3.push_back(Point(10.1909612642098, 1.83620090375816)); polygon3.push_back(Point(12.1485481773505, 4.84508449247446)); polygon3.push_back(Point(11.4416417920497, -2.29648257953892)); polygon3.push_back(Point(10.1547096547072, 0.712401009177374)); //将多边形插入受约束的三角剖分 CDT cdt; cdt.insert_constraint(polygon1.vertices_begin(), polygon1.vertices_end(), true); cdt.insert_constraint(polygon2.vertices_begin(), polygon2.vertices_end(), true); cdt.insert_constraint(polygon3.vertices_begin(), polygon3.vertices_end(), true); //标记由多边形界定的域内的面 mark_domains(cdt); //遍历所有的面 int count = 0; for (Face_handle f : cdt.finite_face_handles()) { if (f->info().in_domain()) ++count; } std::cout << "There are " << count << " facets in the domain." << std::endl; //将结果输出成shp文件,方便查看 { GDALAllRegister(); GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("ESRI Shapefile"); if (!driver) { printf("Get Driver ESRI Shapefile Error!\n"); return false; } const char *filePath = "D:/test.shp"; GDALDataset* dataset = driver->Create(filePath, 0, 0, 0, GDT_Unknown, NULL); OGRLayer* poLayer = dataset->CreateLayer("test", NULL, wkbPolygon, NULL); //创建面要素 for (Face_handle f : cdt.finite_face_handles()) { if (f->info().in_domain()) { OGRFeature *poFeature = new OGRFeature(poLayer->GetLayerDefn()); OGRLinearRing ogrring; for (int i = 0; i < 3; i++) { ogrring.setPoint(i, f->vertex(i)->point().x(), f->vertex(i)->point().y()); } ogrring.closeRings(); OGRPolygon polygon; polygon.addRing(&ogrring); poFeature->SetGeometry(&polygon); if (poLayer->CreateFeature(poFeature) != OGRERR_NONE) { printf("Failed to create feature in shapefile.\n"); return false; } } } //释放 GDALClose(dataset); dataset = nullptr; } return 0; }
在代码的最后,我将生成的三角网输出成shp文件,叠加到原来的多边形中:
效果似乎不是很明显,那么我将原来的两个内环范围涂黑:
说明这个算法可以适配于凹多边形以及带洞多边形的三角网剖分,不得不说CGAL这个库真的非常强大。可惜就是这个库太难以使用了,需要一定的计算几何知识和Cpp高级特性的知识,才能运用自如,值得深入学习。
3. 参考
-
算法:凸多边形最优三角剖分
2019-10-31 18:20:491、问题相关定义: (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。... 凸多边形三角剖分如下图所示: 2、最优子结构性质: 若凸(n+1)边形P={V0,V1……Vn}的最优三角剖分T包含三角形...1、问题相关定义:
(1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。 (2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和为最小。 凸多边形三角剖分如下图所示:
2、最优子结构性质: 若凸(n+1)边形P={V0,V1……Vn}的最优三角剖分T包含三角形V0VkVn,1<=k<=n,则T的权为三个部分权之和:三角形V0VkVn的权,多边形{V0,V1……Vk}的权和多边形{Vk,Vk+1……Vn}的权之和。如下图所示:
可以断言,由T确定的这两个子多边形的三角剖分也是最优的。因为若有{V0,V1……Vk}和{V0,V1……Vk}更小权的三角剖分,将导致T不是最优三角剖分的矛盾。因此,凸多边形的三角剖分问题具有最优子结构性质。 3、递推关系: 设t[i][j],1<=i<j<=n为凸多边形{Vi-1,Vi……Vj}的最优三角剖分所对应的权值函数值,即其最优值。最优剖分包含三角形Vi-1VkVj的权,子多边形{Vi-1,Vi……Vk}的权,子多边形{Vk,Vk+1……Vj}的权之和。
因此,可得递推关系式:
凸(n+1)边形P的最优权值为t[1][n]。
详细解析:
(1)什么是凸多边形?如下图所示,是一个凸多边形
如下图所示,不是一个凸多边,因为v1v3连线落在了多边形的外部
凸多边形不相邻的两个顶点的连线称为凸多边形的弦
(2)什么是凸多边形的三角剖分?
凸多边形的三角剖分是指将一个凸多边形分割成互不相交的三角形的弦的集合。如下图所示,都是三角形的剖分,三角形的剖分有很多种:
如果我们在给定凸多边形及定义在边,弦上的权值,即任意两点之间定义一个数值作为i权值,如图所示:
三角形上权值之和是指三角形的3条边上的权值之和:
w(vi vk vj)=|vi vk| + |vk vj | + |vi vj|
如图所示,w(v0v1v4)=|v0v1| + |v1v4| + |v0v4| = 22+8+5=15.
(3)什么是凸多边形最优三角剖分?
一个凸多边形的三角剖分有很多种,最优三角剖分就是划分的各三角形上权函数之和最小的三角剖分。
凸多边形最优三角剖分满足动态规划的最优子结构性质,可以从自底向上逐渐推出整体的最优。 (1)确定合适的数据结构 采用二维数组weight[ ][ ]记录各个顶点之间的连接权值,二维数组t[ ][ ]存放各个子问题的最优值,二维数组s[ ][ ]存放各个子问题的最优策略。 (2)初始化 输入顶点数n,然后依次输入各个顶点之间的连接权值存储在二维数组weight[ ][ ]中,令n=n-1(顶点标号从v0开始), t[i][i]=0,s[i][i]=0,其中i=1,2,3,4……,n-1。 (3)循环 按照递归关系式计算3个顶点{v i-1,vi,vi+1}的最优三角剖分,j=i+1,将最优值存入t[i][j],同时将最优策略存入s[i][j],i=1,2,3,……,n-1。 按照递归关系式计算4个顶点{v i-1,vi,vi+1,vi+2}的最优三角剖分,j=i+2,将最优值存入t[i][j],同时将最优策略存入s[i][j],i=1,2,3,……,n-2。 以此类推,直到求出所有顶点{v0,v1,v2,……,vn}的最优三角剖分,并将最优值存入t[1][n],将最优策略记入s[1][n] (4)构造最优解 根据最优决策信息数组s[ ][ ]递归构造最优解,即输出凸多边形的最优剖分的所有弦。s[1][n],表示凸多边形最优三角剖分位置。 如果子问题1为空,即没有一个顶点,说明V0Vs[1][n]是一条边,不是弦,不需要输出,否则,输出该弦V0Vs[1][n] 如果子问题2为空,即没有一个顶点,说明Vs[1][n]Vn是一条边,不是弦,不需要输出,否则,输出该弦Vs[1][n]Vn 递归构造两个子问题{ v0,v1,v2,……,Vs[1][n] } 和 { Vs[1][n] ,v1,v2,……,vn },一直递归到子问题为空停止。
源代码:#include<bits/stdc++.h> using namespace std; const int M =1111; int n; //顶点数 int s[M][M];//记录最优策略二维数组 double t[M][M];//记录最优值二维数组 double weight[M][M];//记录各顶点之间权值的二维数组 void MinWeightTriangulation() { for (int i=1;i<=n;i++) //初始化 { t[i][i]=0; s[i][i]=0; } for(int r=2;r<=n;r++)//r为问题规模,r=2实际上有三个点 r为当前计算的链长(子问题规模) { for (int i=1;i<=n-r+1;i++)//n-r+1为最后一个r链的前边界 { int j=i+r-1; //计算前边界为r,链长为r的链的后边界 t[i][j]=t[i+1][j]+weight[i-1][i]+weight[i][j]+weight[i-1][j];//将链ij划分为A(i) * ( A[i+1:j] )这里实际上就是k=i //策略为k=i的情况 s[i][j]=i; for (int k=i+1;k<j;k++) //枚举划分点i到j所有情况 { //将链ij划分为( A[i:k] )* (A[k+1:j]) double u=t[i][k]+t[k+1][j]+weight[i-1][k]+weight[k][j]+weight[i-1][j]; if(t[i][j]>u) { t[i][j]=u; s[i][j]=k; } } } } } void Traceback(int i,int j) //递归求解所有子问题的弦。 { if(i==j) return ; Traceback(i,s[i][j]); Traceback(s[i][j]+1,j); cout<<"三角剖分顶点:V"<<i-1<<",V"<<j<<",V"<<s[i][j]<<endl; } int main() { int i; int j; cout << "请输入顶点个数n:"<< endl; cin >> n; n--; cout << "请依次输入各顶点的连接权值:" << endl; for (i=0;i<=n;++i) { for (j=0;j<=n;++j) { cin >> weight[i][j]; } } MinWeightTriangulation(); cout << "最优三角剖分的权值和是:" << endl; cout << t[1][n]<< endl; cout << "三角剖分顶点:"<< endl; Traceback(1,n); return 0; }
运行效果1:
运行效果2: -
C++多边形三角剖分,去耳法等三种算法
2022-03-24 17:09:261:原始去耳法,随机找一点判断凸角, 2:优化去耳法 3:解决有洞口的多边形 -
凸多边形最优三角剖分(算法设计:动态规划)
2018-09-20 09:54:08一、动态规划 和分治法类似,把原问题划分成若干个子问题,不同的是,分治法(子问题间互相独立),动态规划(子问题不独立) 动态规划: (1)找出最优解的性质,刻画其...三角剖分将多边形分割成互不想交的... -
Python3.6实现delaunay三角剖分算法,不规则三角网的构建
2019-06-03 09:29:25用python3.6实现delaunay三角剖分算法,读入存有坐标的csv文件,计算出结果用Tkinter库显示。 -
带岛屿多边形Delaunay三角剖分算法 (2009年)
2021-05-09 16:21:01提出一种适用于任意多边形(含岛屿或不含岛屿)的统一Delaunay三角剖分算法。该算法首先将带岛屿多边形的所有顶点统一构建基于多边形边约束的Delaunay不规则三角网(CD-TIN);基于三角形顶点绕向,提出了多边形域外... -
_凸_字形单调多边形三角剖分算法的研究.pdf
2011-12-30 19:57:07单调多边形的三角剖分是计算几何的一个重要分支,其中严格单调多边形的三角剖分已有了 线性时间算法,但该算法对于一般单调多边形还不能给出正确的剖分....法进行了详细分析,给出了一般单调多边形的三角剖分算法. -
凸多边形最优三角剖分
2020-04-16 11:27:25分治算法中的最优子结构 对输入的n个顶点来说,只用得到这n个顶点中的三个顶点,使其构成的三角形周长之和最小,其他的就啥也不用管,进行下一次循环就行了。 这个是网上找到的递推公式。 首先,从n个顶点中找到,... -
简单多边形三角化最佳剖分算法多线程滚动条图形编程Java源程序
2021-03-11 09:16:12本程序提供一种新的剖分形式,它是实现简单多边形准实时的在线的线性时间剖分的必要形式,这种剖分由凸环和/或凹环组成,最终可以线性时间转化为三角剖分。 适合于计算机图形学、计算几何、机器人运动及图形游戏... -
动态规划之凸多边形的最优三角剖分
2021-04-28 04:11:32根据动态规划算法的主要思想,可以把整个问题分成几个子问题,把这些自问题经过处理后得到整个问题的解以及最优解。如图:假设是一个n边形,有n个顶点,那么需要有n-3条弦将其分为n-2个三角形,从而权值最小。首先,... -
简单多边形的动态Delaunay三角剖分算法 (2011年)
2021-04-23 11:07:09提出了一种简单多边形的动态Delaunay三角剖分算法,其时间复杂度为O( n) .从理论上证明了算法的正确性,并利用Python语言开发了一款动态Delaunay三角网生成软件,最后通过大量数据测试了该软件的健壮性并得到实例证实. -
【算法设计与分析】 凸多边形最优三角剖分(动态规划)
2021-05-03 02:16:41【算法设计与分析】 凸多边形最优三角剖分(动态规划) 【问题描述】 使用动态规划算法解凸多边形最优三角剖分问题,具体来说就是,依据递归式,按照顺序求得子问题,使得该三角剖分中诸三角形上权之和为最小。 ... -
简单多边形的三角剖分(并附带python实现代码)
2021-10-20 23:27:17简单多边形的三角剖分 1 折线、闭折线,简单闭折现 折线:将平面上一些点的序列连接起来,可以得到一条折线。 如:有点列A1,A2,...,AnA_1,A_2,...,A_nA1,A2,...,An,则将其顺次连接,得到的一条折线。 点列... -
本科算法实验-凸多边形三角剖分【数据+代码+说明+流程图+测试用例】
2019-01-08 19:58:03本科算法实验-凸多边形三角剖分【数据+代码+说明+流程图+测试用例】 -
凸多边形最优三角剖分--算法设计与分析
2022-04-16 18:48:33public class minWeightTriangulation { public static int weight[][]= {{0,2,3,5,6,4},{2,1,0,5,6,4},{3,1,2,6,5,4}, {3,5,6,2,3,5},{6,2,4,3,5,4},{6,5,4,2,2,3}}; public static void ... -
三角剖分算法
2021-07-19 14:16:06二、散乱点集剖分算法 1、Lawson算法 2、Bowyer算法 3、算法的优化 4、程序实现 三、三角形剖分算法 1、实现思想 2、代码实现 一、引言 1、背景 本算法来源于美术馆问题,美术馆问题如下:假如有一个凹... -
任意多边形的三角剖分可视化实现(先划分成单调多边形,再在单调多边形中做三角剖分)
2020-06-09 14:39:22目前有很多不同的算法实现了对多边形的三角剖分,三角化算法所追求的目标主要有两个:形状匀称和计算速度快,这也决定了多边形三角剖分的两个不同的应用方向。在形状匀称方面,人们对三角化的性质、 形状最优准则及... -
计算几何---多边形三角剖分算法研究与实现
2011-04-12 20:43:00多边形三角剖分算法的理论。 -
算法设计与分析——凸多边形最优三角剖分(动态规划)
2021-02-26 20:46:18一、问题描述多边形是平面上一条分段线性的闭曲线。也就是说,多边形是由一系列首尾相接的直线段组成的。组成多边形的各直线段称为该多边形的边。多边形相接两条边的连接点称为多边形的顶点。若多边形的边之间除了... -
动态规划--凸多边形最优三角剖分
2020-01-24 20:47:46最小的大凸多边形等于 “左子多边形的最小” + “右子多边形的最小” + “中间的三角形”;以此递归下去。 (3)代码实现 public class fuck { private int n; // n凸多边形的边长 privat... -
7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!
2021-09-24 16:09:34给定n边凸多边形P,要求确定该凸多边形的三角剖分(将多边形分割成n-2个三角形),使得该三角剖分中诸三角形上权之和为最小。各边弦的权值以由输入数据给出,以无向图的形式表示。三角形的权值等于三条边权值相加。 ... -
基于最小距离的简单多边形三角剖分 (2006年)
2021-06-01 01:42:20基于最小距离的多边形三角剖分算法是,多边形的每个顶点对应一个距离,对这些距离进行比较,依次连接最小距离,连接后判断相邻两点的凹凸性且改变连接点的相邻点的距离,除凹点外,并不需要对所有的点进行判断和计算。... -
凸多边形最优三角剖分(C语言编写) 算法
2011-12-01 16:37:50凸多边形最优三角剖分(C语言编写) 算法 -
凸多边形最优三角剖分的两种算法分析
2017-03-28 15:19:02使用了两种动态规划算法处理凸多边形最优三角剖分问题,算法1直观,算法2 简洁。 -
MATLAB小技巧(2)Delaunay三角剖分算法
2022-04-18 23:33:39MATLAB小技巧(2)Delaunay三角剖分算法前言一. MATLAB仿真一二. MATLAB仿真二三. MATLAB仿真三四. 小结 前言 MATLAB进行图像处理相关的学习是非常友好的,可以从零开始,对基础的图像处理都已经有了封装好的许多可... -
凸多边形最优三角剖分(动态规划)报告.doc
2019-12-26 16:34:40算法设计与分析实验报告,附已通过源码,供学习参考,共勉♪ 目录摘要如下: 1.问题描述 2.实验目的 3.实验原理 4.实验设计 (包括输入格式、算法、输出格式) 5.实验结果与分析 (除了截图外,实验结果还用...