跳转至

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

读取边界几何信息

[node, edge] = triread('lake.msh');   % 读取 PSLG 几何

调节 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 和角度分布');