Mesh2D:opts.rho2网格优化¶
约 246 个字 104 行代码 2 张图片 预计阅读时间 2 分钟
增加了优化参数:opts
通过条件 rho2(radius-edge 比)控制生成的三角形网格在 单元质量和密度 上的变化
rho2
:
- 对每个三角形单元,计算其 外接圆半径 R 和 最短边长 e,取比值 \(\rho=\frac{R}{e}\)。
- rho2 越小,三角形越接近正三角形(所有边长接近,角度接近 60°)。
- rho2 越大,mesh 会出现长条或“瘦”三角形(角度很小,单元“扭曲”)。
常用经验值:
- rho2 = 1.00(极致质量,接近正三角形)
- rho2 = 1.25(大部分工程推荐值,质量/效率平衡)
- rho2 > 1.5(mesh 稀疏但质量可能较差)
demo1¶
读取边界几何信息¶
调节 rho2¶
- rho2 = 1.0:每个三角形都趋近于正三角形(R/e→1),最优 mesh 质量。
- ho2 增大到 1.5,甚至更大:允许更“扁”的三角形(最小角变小),mesh 变稀疏,但单元质量变差
% ==== mesh1: rho2 = 1.50(低质量,较稀疏) ====
opts.kind = 'delaunay';
opts.rho2 = 1.50;
[vert1, etri1, tria1, tnum1] = refine2(node, edge, [], opts);
figure;
patch('faces', tria1(:,1:3), 'vertices', vert1, ...
'facecolor', 'w', 'edgecolor', [.2,.2,.2]);
hold on; axis image off;
patch('faces', edge(:,1:2), 'vertices', node, ...
'facecolor', 'w', 'edgecolor', [0.1,0.1,0.1], 'linewidth', 1.5);
title('rho2 = 1.50 (较稀疏,质量一般)');
% ==== mesh2: rho2 = 1.00(高质量,更密集) ====
opts.rho2 = 1.00;
[vert2, etri2, tria2, tnum2] = refine2(node, edge, [], opts);
绘图¶
figure;
patch('faces', tria2(:,1:3), 'vertices', vert2, ...
'facecolor', 'w', 'edgecolor', [.2,.2,.2]);
hold on; axis image off;
patch('faces', edge(:,1:2), 'vertices', node, ...
'facecolor', 'w', 'edgecolor', [0.1,0.1,0.1], 'linewidth', 1.5);
title('rho2 = 1.00 (更密,高质量)');
完整代码:
% 假定 lake.msh 已放在当前目录或 poly-data 子目录下
[node, edge] = triread('poly-data/lake.msh'); % 读取 PSLG 几何
% ==== mesh1: rho2 = 1.50(低质量,较稀疏) ====
opts.kind = 'delaunay';
opts.rho2 = 1.5;
[vert1, etri1, tria1, tnum1] = refine2(node, edge, [], opts);
figure;
subplot(1,2,1)
patch('faces', tria1(:,1:3), 'vertices', vert1, ...
'facecolor', 'w', 'edgecolor', [.2,.2,.2]);
hold on; axis image off;
patch('faces', edge(:,1:2), 'vertices', node, ...
'facecolor', 'w', 'edgecolor', [0.1,0.1,0.1], 'linewidth', 1.5);
title('rho2 = 1.50 (较稀疏,质量一般)');
% ==== mesh2: rho2 = 1.00(高质量,更密集) ====
opts.rho2 = 1.00;
[vert2, etri2, tria2, tnum2] = refine2(node, edge, [], opts);
subplot(1,2,2)
patch('faces', tria2(:,1:3), 'vertices', vert2, ...
'facecolor', 'w', 'edgecolor', [.2,.2,.2]);
hold on; axis image off;
patch('faces', edge(:,1:2), 'vertices', node, ...
'facecolor', 'w', 'edgecolor', [0.1,0.1,0.1], 'linewidth', 1.5);
title('rho2 = 1.00 (更密,高质量)');
参数对比¶
完整代码:
% 外正方形
node = [0 0; 1 0; 1 1; 0 1];
edge = [1 2; 2 3; 3 4; 4 1];
% 圆孔
N = 24; r = 0.2; cx = 0.5; cy = 0.5;
theta = linspace(0, 2*pi, N+1)'; theta(end) = [];
circle_nodes = [cx + r*cos(theta), cy + r*sin(theta)];
circle_edges = [(5:4+N)' [6:4+N 5]'];
node = [node; circle_nodes];
edge = [edge; circle_edges];
rhos = [1.00, 1.25, 1.50]; % 多组 rho2
figure;
for k = 1:length(rhos)
opts.kind = 'delaunay';
opts.rho2 = rhos(k);
[vert, etri, tria, tnum] = refine2(node, edge, [], opts);
subplot(2,length(rhos),k)
patch('faces', tria(:,1:3), 'vertices', vert, ...
'facecolor', 'w', 'edgecolor', [.2,.2,.2]);
hold on; axis image off;
patch('faces', edge(:,1:2), 'vertices', node, ...
'facecolor', 'w', 'edgecolor', [0.1,0.1,0.1], 'linewidth', 1.2);
title(['rho2 = ', num2str(rhos(k)), ', N=', num2str(size(tria,1))]);
% --- 统计三角形角度 ---
A = vert(tria(:,1),:);
B = vert(tria(:,2),:);
C = vert(tria(:,3),:);
% 计算三角形三个角
a = sqrt(sum((B - C).^2,2));
b = sqrt(sum((A - C).^2,2));
c = sqrt(sum((A - B).^2,2));
angle1 = acosd( (b.^2 + c.^2 - a.^2) ./ (2.*b.*c) );
angle2 = acosd( (a.^2 + c.^2 - b.^2) ./ (2.*a.*c) );
angle3 = 180 - angle1 - angle2;
% 拼成一列
all_angles = [angle1; angle2; angle3];
subplot(2,length(rhos),k+length(rhos))
histogram(all_angles, 0:5:180, 'FaceColor', [0.2 0.5 0.8]);
xlabel('角度(°)'); ylabel('数量');
title(['rho2=',num2str(rhos(k)), ', min=', num2str(min(all_angles),3)]);
grid on;
end
sgtitle('不同rho2下的 mesh 和角度分布');