生成网格并细化三角形网格
Generate mesh and refine mesh of triangles
我需要找到一种方法来对三角形进行网格化,然后使用优化进行优化。
我的原始三角形的顶点存储在大小为 nb_points * 2 的矩阵中。
我的脸存储在 nb_faces * 3 矩阵中。
每个人脸的数据存储在 nb_face * 1 矩阵中。
网格划分是通过使用三角形线段的中间划分区域来完成的。
示例:
来源:
vertices = [0 1 ;
2 3 ;
4 1 ;
4 5];
faces = [1 2 3;
2 3 4];
data = [1 2];
网格划分后的预期结果:
vertices = [0 1;
2 3;
4 1;
4 5;
1 2;
3 2;
2 1;
3 4;
4 3];
faces = [1 5 7;
2 5 6;
5 6 7;
7 6 3;
2 6 8;
6 8 9;
6 9 3;
8 4 9];
data = [1 1 1 1 2 2 2 2];
我正在显示使用:
FV.Vertices = vertices;
FV.Faces = faces;
FV.FaceVertexCData = data;
figure; hold on; axis equal; grid on;
patch(FV,'FaceColor','flat');
精度:
我不想使用以下函数,这些函数会提供太多顶点和面:
数据是温度,因为这是热传递模拟。
使用 for 循环可以很容易地完成,这是一个解决方案:
% Dummy data
vertices = [0 1 ;
2 3 ;
4 1 ;
4 5];
faces = [1 2 3;
2 3 4];
data = [1 2];
% Number of vertices
vnum = size(vertices,1);
% new faces empty vector
nfaces = [];
% triangular shift
tshift = [2,-1,-1].';
% Run the algorithm
for ii = 1:size(faces,1)
% For each triangle get the 3 pairs of vertices
nsk = [faces(ii,1), faces(ii,2);faces(ii,2), faces(ii,3);faces(ii,3), faces(ii,1)];
% Compute the center of each pair of vertices
cmiddle = (vertices(nsk(:,1),:)+vertices(nsk(:,2),:))/2
% Compute the new faces
nfaces = [nfaces;[nsk(:,1),vnum+(ii*3-3+[1:3].'),vnum+(ii*3-3+[1:3].')+tshift];[(vnum+(ii*3-2)):(vnum+(ii*3))]]
% Add the new vertices
vertices = [vertices;cmiddle];
end
% Delete the duplicate vertices
[vertices,~,ind] = unique(vertices,'rows');
faces = ind(nfaces);
% Plot
figure; hold on; axis equal; grid on;
patch('Faces',faces,'Vertices',vertices,'FaceVertexCData',kron(data,ones(1,4)).','FaceColor','flat')
colorbar
如果您找到一种无需 for 循环即可生成 nsk
向量的方法,您甚至可以摆脱循环。此代码仅适用于三角形,但可以根据需要进行调整。
结果:
您可以重复操作:
我需要找到一种方法来对三角形进行网格化,然后使用优化进行优化。 我的原始三角形的顶点存储在大小为 nb_points * 2 的矩阵中。 我的脸存储在 nb_faces * 3 矩阵中。 每个人脸的数据存储在 nb_face * 1 矩阵中。 网格划分是通过使用三角形线段的中间划分区域来完成的。
示例: 来源:
vertices = [0 1 ;
2 3 ;
4 1 ;
4 5];
faces = [1 2 3;
2 3 4];
data = [1 2];
网格划分后的预期结果:
vertices = [0 1;
2 3;
4 1;
4 5;
1 2;
3 2;
2 1;
3 4;
4 3];
faces = [1 5 7;
2 5 6;
5 6 7;
7 6 3;
2 6 8;
6 8 9;
6 9 3;
8 4 9];
data = [1 1 1 1 2 2 2 2];
我正在显示使用:
FV.Vertices = vertices;
FV.Faces = faces;
FV.FaceVertexCData = data;
figure; hold on; axis equal; grid on;
patch(FV,'FaceColor','flat');
精度: 我不想使用以下函数,这些函数会提供太多顶点和面:
数据是温度,因为这是热传递模拟。
使用 for 循环可以很容易地完成,这是一个解决方案:
% Dummy data
vertices = [0 1 ;
2 3 ;
4 1 ;
4 5];
faces = [1 2 3;
2 3 4];
data = [1 2];
% Number of vertices
vnum = size(vertices,1);
% new faces empty vector
nfaces = [];
% triangular shift
tshift = [2,-1,-1].';
% Run the algorithm
for ii = 1:size(faces,1)
% For each triangle get the 3 pairs of vertices
nsk = [faces(ii,1), faces(ii,2);faces(ii,2), faces(ii,3);faces(ii,3), faces(ii,1)];
% Compute the center of each pair of vertices
cmiddle = (vertices(nsk(:,1),:)+vertices(nsk(:,2),:))/2
% Compute the new faces
nfaces = [nfaces;[nsk(:,1),vnum+(ii*3-3+[1:3].'),vnum+(ii*3-3+[1:3].')+tshift];[(vnum+(ii*3-2)):(vnum+(ii*3))]]
% Add the new vertices
vertices = [vertices;cmiddle];
end
% Delete the duplicate vertices
[vertices,~,ind] = unique(vertices,'rows');
faces = ind(nfaces);
% Plot
figure; hold on; axis equal; grid on;
patch('Faces',faces,'Vertices',vertices,'FaceVertexCData',kron(data,ones(1,4)).','FaceColor','flat')
colorbar
如果您找到一种无需 for 循环即可生成 nsk
向量的方法,您甚至可以摆脱循环。此代码仅适用于三角形,但可以根据需要进行调整。
结果:
您可以重复操作: