编程语言
首页 > 编程语言> > 图论工具箱-在图上执行计算的工具箱【含Matlab源码】

图论工具箱-在图上执行计算的工具箱【含Matlab源码】

作者:互联网

该工具箱包含有用的函数来处理图形和三角剖分。

n个顶点的图的基本表示形式是邻接​​矩阵A,如果顶点i与顶点j链接,则A(i,j)= 1。图通常带有R ^ d的几何实现,其中(d,n)矩阵的顶点(:,i)是第i个顶点的位置。

m个面和n个顶点的三角剖分通过以下方式表示:
*一组面,它是(3,m)矩阵,其中face(:,i)是第i个面的顶点索引。
*一组顶点,是(d,n)矩阵。
该工具箱包含的功能可以更轻松地处理三角剖分数据结构,并允许检索顶点和面1形环并从邻接关系切换到面。

工具箱的图形部分包含创建合成图形和计算最短路径的功能(dijkstra和isomap算法)。

该工具箱包含许多功能来处理三角剖分的光谱理论。您可以从文件中加载三角剖分,然后显示生成的网格。它允许计算各种拉普拉斯算子,并使用频谱分解,谐波映射,自由边界谐波映射和isomap计算参数化。

内容

首先,将其他脚本添加到路径中。

path(path, 'toolbox/');
path(path, 'off/');
clear options;

3D网格加载和显示

3D网格由大小为(3,n)的顶点数组(包含3D(有时为2D)顶点的位置)和大小为(3,m)的面数组(包含每个三角化面的索引)组成。

% load the mesh
name = 'elephant-50kv';
options.name = name; % useful for displaying
[vertex,faces] = read_mesh(name);
% display the mesh
clf;
plot_mesh(vertex, faces);
shading interp;

您可以缩放网格并显示其三角面

clf;
for i=1:4
    subplot(2,2,i);
    plot_mesh(vertex, faces);
    shading faceted;
    zoom(1.8^(i+1));
end

您可以计算网格的法线,并沿法线移动顶点的位置。

options.face_vertex_color =  [];
vertex1 = perform_normal_displacement(vertex,faces,.03);

clf;
subplot(1,2,1);
plot_mesh(vertex,faces,options); shading interp; axis tight;
subplot(1,2,2);
plot_mesh(vertex1,faces,options); shading interp; axis tight;

3D网格上的微积分

您可以在3D网格上计算微分和求平均值算子的矩阵(稀疏)。您还可以计算曲率和法线。

您可以计算法线并显示它们。

% load a mesh
name = 'mushroom';
options.name = name; % useful for displaying
[vertex,faces] = read_mesh(name);
% compute normal per vertex and per face
[normal,normalf] = compute_normal(vertex,faces);
% display
options.normal = normal;
clf; plot_mesh(vertex,faces,options); shading interp; axis tight;
options.normal = [];

您可以使用局部平均和PCA分析来计算曲率量。

% load the mesh
name = 'elephant-50kv';
options.name = name; % useful for displaying
[vertex,faces] = read_mesh(name);
% compute the curvature
options.curvature_smoothing = 10;
options.verb = 0;
[Umin,Umax,Cmin,Cmax,Cmean,Cgauss,Normal] = compute_curvature(vertex,faces,options);
% display
clf;
subplot(1,2,1);
options.face_vertex_color = perform_saturation(Cgauss,1.2);
plot_mesh(vertex,faces, options); shading interp; colormap jet(256);
title('Gaussian curvature');
subplot(1,2,2);
options.face_vertex_color = perform_saturation(abs(Cmin)+abs(Cmax),1.2);
plot_mesh(vertex,faces, options); shading interp; colormap jet(256);
title('Total curvature');

拉普拉斯算子是计算二阶导数的高通算子。

name = 'elephant-50kv';
options.name = name; % useful for displaying
[vertex,faces] = read_mesh(name);
% options for the Laplacians
laplacian_type = 'conformal'; % slow to compute
laplacian_type = 'combinatorial'; % fast, but inexact
laplacian_type = 'distance'; % fast and more accurate
% compute a normalized Laplacian
options.symmetrize = 0;
options.normalize = 1;
L = compute_mesh_laplacian(vertex,faces,laplacian_type,options);
% compute a non normalized Laplacian
options.symmetrize = 0;
options.normalize = 1;
L0 = compute_mesh_laplacian(vertex,faces,laplacian_type,options);

计算并显示拉普拉斯算子的一​​些特征向量。它们等效于表面上的傅立叶正弦曲线。

% compute a few eigenmodes
nb = 60;
opts.disp = 0;
[V,D] = eigs(L0,nb,'SM',opts); % warning : it takes lot of time
V = real(V(:,end:-1:1));
% display them on the mesh
ilist = round(linspace(3,nb-3, 6));
tau=2.2; % saturation for display
clf;
for i=1:length(ilist)
    % subplot(1,length(ilist),i);
    v = real(V(:,ilist(i)));
    v = clamp( v/std(v),-tau,tau );
    options.face_vertex_color = v;
    subplot(2,3,i);
    plot_mesh(vertex,faces,options);
    shading interp; camlight; axis tight; % zoom(zoomf);
    colormap jet(256);
end

完整资料领取:https://ai.52learn.online/9572

标签:name,vertex,网格,mesh,源码,Matlab,faces,工具箱,options
来源: https://blog.csdn.net/update7/article/details/113666951