首页/文章/ 详情

基于Matlab的三角形网格自动生成小工具 | Distmesh进阶

1年前浏览669

前面的推文给大家介绍了Distmesh函数如何构建基础的几何区域:圆形、多边形、椭圆,这次给大家介绍一个非常实用的小功能,能够在基础几何区域的基础上演变为各种几何区域。

主要内容

  1. 内置函数的介绍及应用;
  2. 如何控制网格尺寸密度?
  3. 壳单元、四面体网格的自动生成;

内置函数

为了不局限于简单的几何区域,作者编写了一些内置函数,用于结合几何结构。

function d=ddiff(d1,d2) % 区域相减(空心区域创建)
function d=dunion(d1,d2)% 区域并合
function d=dintersect(d1,d2) % 区域交集
function p=pshift(p,x0,y0) % 几何区域移动,向左移动x0,向下移动y0
function p=protate(p,phi) % 点的旋转(围绕着原点逆时针旋转phi弧度)

以上3个函数是常用的几何操作函数,分别为:区域相减、并集、交集,数学解释如下:

 

内置函数使用

% dunion 合并区域
fd = @(p) dunion(dcircle(p,0.8,1,0.4),...
                 dcircle(p,1.2,1.0,0.4));             
pfix = [1,1.35;1,0.65];
[p,t]=distmesh2d(fd,@huniform,0.05,[0,0;2,2],pfix);
% ddiff 区域相减(空心区域创建)
fd=@(p) ddiff(dcircle(p,0.8,1,0.4),...
                dcircle(p,1.2,1.0,0.4));
pfix = [1,1.35;1,0.65];
[p,t]=distmesh2d(fd,@huniform,0.05,[0,0;2,2],pfix);
% dintersect 区域交集
fd = @(p) dintersect(dcircle(p,0.8,1,0.4),...
                 dcircle(p,1.2,1.0,0.4));             
pfix = [1,1.35;1,0.65];
[p,t]=distmesh2d(fd,@huniform,0.05,[0,0;2,2],pfix);
 
   
   
% pshift移动
fd=@(p) ddiff(dcircle(p,0,0,1),dcircle(pshift(p,0.3,0),0,0,0.4));  
[p,t]=distmesh2d(fd,@huniform,0.1,[-1,-1;1,1],[]);
% protate旋转
fd=@(p) ddiff(dcircle(p,2.5,2,2),dcircle(protate(p,0.1*pi),2.5,2,0.5)); 
[p,t]=distmesh2d(fd,@huniform,0.1,[0,0;5,5],[]);
   
   

网格尺寸密度控制

尺寸密度函数fh在划分非结构化网格的过程中占据着非常重要的地位,因为我们在分析模型时,比较关心的位置往往网格密度布置的较大,不关心的位置可适度稀疏网格密度,这样有利于节省计算时间。

本小节给大家介绍密度函数的使用,文献中没有给出参数的实际含义,只能凭着自己感觉去估计。

 

通过控制变量的方式,探究参数的影响,演示如下:

fd = @(p) ddiff(drectangle(p,-1,1,-1,1),dcircle(p,0,0,0.5));
% fh = @(p) 0.05+0.3*dcircle(p,0,0,0.5);
% fh = @(p) 0.05+0.5*dcircle(p,0,0,0.5);
% fh = @(p) 0.1+0.3*dcircle(p,0,0,0.5);
pfix = [-1,-1;-1,1;1,-1;1,1];
[p,t] = distmesh2d(fd,fh,0.01,[-1,-1;1,1],pfix);
   
   
   
   

在一个模型中往往需要加密的位置不止一个区域,多个区域同时加密时,需要用的min函数,将两个区域关联起来,使用方法取下:

fd = @(p) ddiff(drectangle(p,-1,1,-1,1),dcircle(p,0,0,0.5));
fh = @(p) min(0.05+0.3*dcircle(p,0,0,0.5),...
            0.01+0.1*dcircle(p,-1,1,0))
pfix = [-1,-1;-1,1;1,-1;1,1];
[p,t] = distmesh2d(fd,fh,0.01,[-1,-1;1,1],pfix);
   
   

三维网格生成

三维网格的生成过程与二维类似,可以自己构建符号距离函数,也可以调用原作者编写的内置函数,如:dsphere函数构建三维球体区域。

% 三维球面
fd=@(p) dsphere(p,0,0,0,1);
[p,t]=distmeshsurface(fd,@huniform,0.2,1.1*[-1,-1,-1;1,1,1]);

% 三维椭球面
fd=@(p) p(:,1).^2/4+p(:,2).^2/1+p(:,3).^2/1.5^2-1;
[p,t]=distmeshsurface(fd,@huniform,0.2,[-2.1,-1.1,-1.62.1,1.1,1.6]);

% 三维局部加密
fd=@(p) dsphere(p,0,0,0,1);
fh=@(p) 0.05+0.5*dsphere(p,0,0,1,0);
[p,t]=distmeshsurface(fd,fh,0.15,1.1*[-1,-1,-1;1,1,1]);

% 三维球体
fd=@(p) dsphere(p,0,0,0,1);
[p,t]=distmeshnd(fd,@huniform,0.1,1.1*[0,0,0;1,1,1],[]);
   
   
   
    

来源:易木木响叮当
控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-02
最近编辑:1年前
易木木响叮当
硕士 有限元爱好者
获赞 208粉丝 227文章 327课程 2
点赞
收藏
未登录
2条评论
Ycy
签名征集中
7月前
大佬 3D的能讲讲吗
回复
徐叁湜
签名征集中
10月前
很有用 小伙子
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈