- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MATLAB Delaunay算法提取离散点边界的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
最近在项目进行中遇到要提取离散点边界的问题,像我这样的对于matlab不是特别熟练的朋友一开始肯定摸不着头脑,到底选用哪种算法可以有效地提取到所有已知点的轮廓线呢。本人经过大量的文献搜索及代码实验找到了几个效果比较好的轮廓提取代码,在这里做个总结,并且希望能够对遇到同样问题的朋友有所启发.
关于离散点边界提取的三种方法:
1.Convhull 离散点集获得边界 。
2.Alpha Shape算法检测边缘点 。
3.Delaunay 三角剖分算法 。
前两种方法在之前的博客中已经做了总结这里就不展开了,现在主要介绍第三种算法.
该算法的总体思路如下:
1、利用 delaunay 函数,对所有数据点进行 Delaunay 三角剖分处理,delaunay 函数的返回值是一个 N * 3 的矩阵,其中 N 为剖分出的三角形个数,3 为每个三角形的三个端点的序号.
2、根据 triangles 矩阵,提取出所有 delaunay 三角剖分时所连接的边,依次扫描 triangles 矩阵的每一行,将 delaunay 三角剖分时所连接的边添加到一个新的矩阵中,最后构成一个 M * 2 的矩阵,其中 M 是一共所连接的边的条数.
3、显然,最小凸多边形上的边应该仅在以上矩阵中出现一次,因此,将以上矩阵中那些出现次数超过一次的边全部去掉,最后保留的便是最小凸多边形的边.
4、根据最小凸多边形的边,很容易得到构成最小凸多边形的结点的顺序,从而解决问题.
输入参数 points 是一个 2 * P 矩阵, P 为数据点的个数,第一行是这些数据点对应的 x 坐标,第二行是对应的 y 坐标;输出参数 polygon 是一个 2 * Q 矩阵, Q 为凸多边形的顶点个数(首尾相连),第一行是这些顶点对应的 x 坐标,第二行是对应的 y 坐标。代码实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
function polygon = minimal_convex_polygon(points)
% 进行 delaunay 三角剖分,将所有连接了的边保存在矩阵 lines 中
triangles = sort(delaunay(points(1, :), points(2, :)), 2);
lines = zeros(size(triangles, 1) * 3, 2);
for
i = 1:size(triangles, 1)
lines(3 * i - 2,:) = [triangles(i, 1), triangles(i, 2)];
lines(3 * i - 1,:) = [triangles(i, 1), triangles(i, 3)];
lines(3 * i,:) = [triangles(i, 2), triangles(i, 3)];
end
% 去掉 lines 中出现次数超过一次的边
[~, IA] = unique(lines,
'rows'
);
lines = setdiff(lines(IA, :), lines(setdiff(1:size(lines, 1), IA), :),
'rows'
);
% 跟踪 lines 中的数据点,将凸多边形的顶点编号保存在 seqs 中
seqs = zeros(size(lines, 1) + 1,1);
seqs(1:2) = lines(1, :);
lines(1, :) = [];
for
i = 3:size(seqs)
pos = find(lines == seqs(i - 1));
row = rem(pos - 1, size(lines, 1)) + 1;
col =
ceil
(pos / size(lines, 1));
seqs(i) = lines(row, 3 - col);
lines(row, :) = [];
end
% 根据 seqs , 得到凸多边形顶点坐标
polygon = points(:, seqs);
end
|
定义了实现函数,下面进行调用:
1
2
3
4
|
plot(Pp(1,:),Pp(2,:),
'*r'
,
'LineWidth'
, 4); % Pp第一行为x坐标,第二行为y坐标
polygon = minimal_convex_polygon(Pp);
hold on;
plot(polygon(1, :), polygon(2, :),
'LineWidth'
, 2);
|
效果图片我还不会添加进来,有兴趣的朋友可以试一试.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_38991255/article/details/81223437 。
最后此篇关于MATLAB Delaunay算法提取离散点边界的方法的文章就讲到这里了,如果你想了解更多关于MATLAB Delaunay算法提取离散点边界的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我一直在寻找这个问题的答案,但找不到任何有用的东西。 我正在使用 python 科学计算堆栈(scipy、numpy、matplotlib)并且我有一组二维点,为此我使用 scipy.spatial.
我正在试验 scipy.spatial's implementation of Qhull's Delaunay triangulation . 是否有可能以保留输入顶点定义的边的方式生成三角剖分?
我在看这个视频:Delaunay Triangulation我想用它以相同的方式生成程序内容。我很难弄清楚如何使用 LibGDX 提供的 DelaunayTriangulation 类,但我想我终于弄
我正在使用三角剖分库来计算某个大边界内的一组矩形的约束 Delaunay 三角剖分。该算法返回所有边,但也在定义约束的矩形内添加边。 我希望能够创建一个没有任何作为约束的矩形内的边的图形(当然大边界除
我想对带孔的复杂(但不是自相交)多边形进行三角剖分,以便生成的三角形都位于多边形内,完全覆盖该多边形,并遵守 Delaunay 三角形规则。 显然,我可以为所有点构建 Delaunay 三角剖分,但我
我正在使用 Delaunay 对凹多边形进行三角剖分,但它填充了凹面。如何自动删除多边形边界之外的三角形? 最佳答案 自我回答:在某些情况下,这是不可能的。我需要使用受约束的 Delaunay 算法:
如何从 Delaunay 三角剖分中删除大于我需要的距离? 示例数据: x 0 i <- abs( i[ keep ] ) j <- abs( j[ keep ] ) plot( x, y ) seg
大多数迭代算法需要一个初始的空三角形来让球滚动。似乎一个常用的技巧就是将 super 三角形与点集相比变得非常大。 但根据“数值食谱:科学计算的艺术”: “...如果距离仅仅是有限的(到边界点),则构
MATLAB 在 their website 上声明: It is more efficient to edit a delaunayTriangulation to make minor modif
我使用 Matlab 2013 版进行了 Delaunay 三角剖分。我想删除一些三角形,这意味着取消它们的连接性,例如三角形编号 760。我该如何进行此更改?当我尝试编辑连接列表时: dt.Conn
给定点集的 Delaunay 三角剖分,我应该如何索引我的三角剖分以进行快速点定位? 我目前正在遍历所有三角形。对于每个三角形,我正在检查给定点是否在三角形的边界矩形内。如果是,我会使用几何方程检查三
我已经绘制了 n 个随机点 (黑点) 并使用了 delaunay 三角剖分,现在我想插入 m 个随机评估点 (红色点) 所以我需要计算评估点在哪个三角形内。 计算每个点的三角形顶点的方法是什么? 最佳
给定有线表示中的网格的 delaunay 三角剖分,我会喜欢显示没有对角线的表面,我只是想想象一个整洁的正方形。是否有任何选项可以完成此操作,也许是过滤器? 有点像 delaunay->Boundin
在 MATLAB 中,我加载了以下点云: load tetmesh 这会将 X 和 tet 加载到工作区中。因此,我执行了一个散点图,结果如下所示: scatter3(X(:,1), X(:,2),
我有一个具有 V 个顶点和 n 个开口的多边形。如何在 MATLAB 中使用 Delaunay 三角剖分为此多边形创建网格? 我知道我可以使用 delaunay功能,但我不知道如何输入开口。 最佳答案
我想根据二维平面上一组点之间的欧式距离计算最小生成树。我当前的代码存储所有边,然后执行 Prim 算法以获得最小生成树。但是,我知道这样做会占用所有边的 O(n^2) 空间。 在做了一些研究之后,很明
接着是:How to print the faces of a Voronoi diagram? ,我现在有: #include #include #include #include #inc
我刚刚完成了 Delaunay 增量翻转算法的实现。该算法的时间复杂度为 O(N log N)。 该算法的应用是基于将每个点作为电话公司的天线。使用 Delaunay 算法,我必须用这些点对空间进行三
我有一组多边形,它们可能共享公共(public)边和节点。所有这些多边形都是严格不重叠的,尽管它们可以共享一个公共(public)顶点或边。 我想批量对所有这些多边形进行三角剖分,因此,我能想到的解决
我已经实现了 Domiter 和 Zalik 使用的扫描线方法,以在 Java 中为二维空间中的一组点生成受约束的 Delaunay 三角剖分。我想确保我开发的代码真正适用于 n 个随机生成的点和它们
我是一名优秀的程序员,十分优秀!