前面的推文给大家介绍了Distmesh函数如何构建基础的几何区域:圆形、多边形、椭圆,这次给大家介绍一个非常实用的小功能,能够在基础几何区域的基础上演变为各种几何区域。
主要内容:
为了不局限于简单的几何区域,作者编写了一些内置函数,用于结合几何结构。
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.6; 2.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],[]);