本文主要是介绍【NetTopologySuite类库】C#生成Delaunay三角网、生成凹包ConcaveHull,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
介绍
三角网
生成三角网的API地址:https://nettopologysuite.github.io/NetTopologySuite/api/NetTopologySuite.Triangulate.ConformingDelaunayTriangulationBuilder.html#methods
凹包
生成凹包的API地址:
https://nettopologysuite.github.io/NetTopologySuite/api/NetTopologySuite.Algorithm.Hull.ConcaveHull.html
构造一组点的凹壳。凹壳可能是包含所有输入点的非凸多边形。给定的一组点具有由数值目标参数确定的凹陷度不断增加的外壳序列。
凹壳是通过去除点的Delaunay三角剖分的最长外边缘来构建的,直到达到目标标准参数。
【可见此处的凹包是基于三角网生成的】
两个参数:
Maximum Edge Length Ratio
:凹包的最长边缘的长度不大于该值。Maximum Edge Length Factor
:将“最大边长”确定为Delaunay三角剖分中最长和最短边长之差的一小部分。这会将“最大边长”标准化为无标度。值为1将生成凸包;值0产生最大凹度。
优选的参数是使用Maximum Edge Length Factor
(最大边长比),因为它是无标度的和局部的(因此不需要对存在的凹陷总量进行假设)。可以通过直接设置“最大边长”来使用其他长度标准。
生成三角网示例
- 先用wkt创建一个多边形(如下图所示,绿色点为特意标注的多边形顶点)
var wkt = "polygon((0 0,0 6,3 6,3 5,5 5,5 3,2 3,2 2,5 2,5 1,6 1,6 0,2 0,2 -1,7 -1,7 -2,-1 -2,-1 -1,0 -1,0 0))";
var geo = new WKTReader().Read(wkt);
2. 利用上述多边形创建三角网(本质上是使用多边形的顶点)。
var wkt = "polygon((0 0,0 6,3 6,3 5,5 5,5 3,2 3,2 2,5 2,5 1,6 1,6 0,2 0,2 -1,7 -1,7 -2,-1 -2,-1 -1,0 -1,0 0))";
var geo = new WKTReader().Read(wkt);
var tri = new ConformingDelaunayTriangulationBuilder();
tri.SetSites(geo);
var tris = tri.GetEdges(GeometryFactory.Default);
//自行将tris输出成shp文件,如下图所示
生成凹包
默认参数
如介绍中所言,凹壳是通过去除点的Delaunay三角剖分的最长外边缘来构建的。
下面,使用默认参数生成面积最小(删掉的三角边最多,再删就会导致丢失顶点了)的凹包:
var gconcaveHull = new ConcaveHull(geo);
gconcaveHull.MaximumEdgeLength = 0;//默认值就是0
var geo_concaveHull = gconcaveHull.GetHull();
参数MaximumEdgeLength
的默认值就是0,此时所有长度大于0的边,在不丢失顶点的情况都会被删掉。删掉这些边后形成的多边形就是凹包了:
参数MaximumEdgeLength=3
修改参数MaximumEdgeLength=3
,即提高边被删除的底线,边长必须大于3,才会被删除。
如下图所示,箭头所指的边不再被删除。
当提高MaximumEdgeLength
的值后,更多的边会被保留。
参数MaximumEdgeLengthRatio=0.4
除了通过参数MaximumEdgeLength
设置具体的长度限制,
还可以通过参数MaximumEdgeLengthRatio
设置无标度的比例限制。
例如设置0.4的容差:
gconcaveHull.MaximumEdgeLengthRatio = 0.4;
MaximumEdgeLengthRatio
参数的作用方式:
- 找到所有最长边L
- 对于任意边长K,如果
1- K / L > MaximumEdgeLengthRatio
则删除边K,否则保留边K。
通过计算,得到结果:L1应被删除,L2应被保留。
这篇关于【NetTopologySuite类库】C#生成Delaunay三角网、生成凹包ConcaveHull的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!