有限元-区域划分

该博客介绍了如何进行二维区域的网格划分,并通过举例详细阐述了如何根据小正方形序号确定其四个顶点,进而进行三角剖分。文章通过MATLAB代码展示了具体的实现过程,包括节点矩阵Pos的构建和连接矩阵TTT的生成,适用于图形处理和有限元分析等领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

区域划分

这里采用例子 X = [ 0 , 8 ] , Y = [ 0 , 8 ] , h x = 2 , h y = 2 X=[0,8],Y=[0,8],h_x=2,h_y=2 X=[0,8],Y=[0,8],hx=2,hy=2,绘制如下网格划分图像,以这个图像为例,将说明根据小正方形编号确定小正方形的四个顶点 ( l e f t _ d o w n , r i g h t _ d o w n , r i g h t _ u p , l e f t _ u p ) (left\_down,right\_down,right\_up,left\_up) (left_down,right_down,right_up,left_up)
在这里插入图片描述

在图中节点的序号为黑色数字,小正方形的序号为括号外红色数字,括号内的内容表示小正方形的行和列。绿色线条表示将每个小正方形划分为两个小三角形。

这里需要处理的是根据小正方形的序号找到小正方形的四个节点序号,记节点列数为 l e n x lenx lenx,节点行数为 l e n y leny leny,显然,小长方形的列数为 l e n x − 1 lenx-1 lenx1,行数为 l e n y − 1 leny-1 leny1

如图所示,可知 l e n x = 5 , l e n y = 5 lenx = 5,leny=5 lenx=5,leny=5.

因此可以根据小正方形的序号计算出小正方形所在的行和列:

记小正方形的序号为 i i i 这里 i = 1 , 2 , 3 , . . . 24 i = 1,2,3,...24 i=1,2,3,...24.

  • 行: r o w = c e i l ( i / ( l e n x − 1 ) ) row = ceil(i/(lenx-1)) row=ceil(i/(lenx1)),这里 c e i l ceil ceil函数表示向上取整

  • 列: l i s t = i − ( r o w − 1 ) ∗ ( l e n x − 1 ) list = i-(row-1)*(lenx-1) list=i(row1)(lenx1)

  • 例如:当 i = 6 i = 6 i=6时,

    r o w = c e i l ( 6 / ( 5 − 1 ) ) = c e i l ( 1.5 ) = 2 , l i s t = 6 − ( 2 − 1 ) × ( 5 − 1 ) = 2 row = ceil(6/(5-1))=ceil(1.5)=2,list=6-(2-1)\times(5-1)=2 row=ceil(6/(51))=ceil(1.5)=2list=6(21)×(51)=2,因此方块序号 6 6 6对应的位置为 ( 2 , 2 ) (2,2) (2,2)

进一步,根据方格位置坐标可以确定方格的四个顶点位置,如下:

l e f t _ d o w n = ( r o w − 1 ) ∗ l e n x + l i s t left\_down = (row-1) * lenx + list left_down=(row1)lenx+list
r i g h t _ d o w n = r o w ∗ l e n x + l i s t right\_down =row * lenx + list right_down=rowlenx+list
r i g h t _ u p = r o w ∗ l e n x + ( l i s t + 1 ) right\_up =row * lenx + (list + 1) right_up=rowlenx+(list+1)
l e f t _ u p = ( r o w − 1 ) ∗ l e n x + ( l i s t + 1 ) left\_up =(row -1)* lenx + (list + 1) left_up=(row1)lenx+(list+1)

例如:当 i = 6 i=6 i=6时, r o w = 2 , l i s t = 2 row=2,list=2 row=2,list=2,从而有

l e f t _ d o w n = ( r o w − 1 ) ∗ l e n x + l i s t = ( 2 − 1 ) ∗ 5 + 2 = 7 left\_down = (row-1) * lenx + list =(2-1)*5+2 =7 left_down=(row1)lenx+list=(21)5+2=7
r i g h t _ d o w n = r o w ∗ l e n x + l i s t = 2 ∗ 5 + 2 = 12 right\_down =row * lenx + list =2*5+2 =12 right_down=rowlenx+list=25+2=12
r i g h t _ u p = r o w ∗ l e n x + ( l i s t + 1 ) = 2 ∗ 5 + ( 2 + 1 ) = 13 right\_up =row * lenx + (list + 1) =2*5+(2+1)=13 right_up=rowlenx+(list+1)=25+(2+1)=13
l e f t _ u p = ( r o w − 1 ) ∗ l e n x + ( l i s t + 1 ) = ( 2 − 1 ) ∗ 5 + ( 2 + 1 ) = 8 left\_up =(row -1)* lenx + (list + 1) =(2-1)*5+(2+1) =8 left_up=(row1)lenx+(list+1)=(21)5+(2+1)=8
这完全可以和我们的小正方形的四个顶点对应起来,因此,在这个小正方形里面划分的两个小三角形的三个顶点描述是容易的(采用逆时针的顶点描述),即

[ l e f t _ d o w n , r i g h t _ d o w n , r i g h t _ u p ] T [left\_down ,right\_down ,right\_up ]^T [left_down,right_down,right_up]T [ r i g h t _ u p , l e f t _ u p , l e f t _ d o w n ] T [right\_up ,left\_up ,left\_down]^T [right_up,left_up,left_down]T

于是,按照上述节点序号顺序保存节点(共两行,第一行为节点的x坐标,第二行为节点的y坐标,列数对应节点的序号)从而得到节点矩阵 P o s Pos Pos如下:(这里仅展示部分数据,全部数据运行查看)

节点序号(列)12345678910
x x x0000022222
y y y0246802468
  • 存储矩阵Pos时,并没有保存节点序号,所以Pos矩阵大小为 2 × ( l e n x × l e n y ) 2\times(lenx\times leny) 2×(lenx×leny)

以及连接矩阵 T T T(表中的数值表示节点序号)如下:(这里仅展示部分数据,全部数据运行查看)

三角形顶点A172839410
三角形顶点B62738495
三角形顶点C718293104
  • 连接矩阵 T T T保存每个小三角形的节点序号,共有 ( l e n x − 1 ) × ( l e n y − 1 ) (lenx-1)\times(leny-1) (lenx1)×(leny1)个小正方形,每个小正方形下面有两个小三角形,所以 T T T的大小为 3 × [ 2 × ( l e n x − 1 ) × ( l e n y − 1 ) ] 3\times[2\times(lenx-1)\times(leny-1)] 3×[2×(lenx1)×(leny1)]

最后附上这段实例的代码

clc,clear
nx = 4;
ny = 4;
X =[0,8];
Y =[0,8];
hx = (X(2)-X(1))/nx;                                       
hy = (Y(2)-Y(1))/ny;
x = X(1):hx:X(2);
y = Y(1):hy:Y(2);
lenx = length(x);
leny = length(y);

% 网格划分 pos对应节点, T的每一列对应三角形的三个顶点(逆时针)
pos = zeros(2,lenx*leny);
for i = 1:lenx
    pos(1,(1 + (i-1)*leny):i*(leny)) = x(i);
    pos(2,(1 + (i-1)*leny):i*(leny)) = y;
    plot(x(i)*ones(leny),y,'color',[0.30,0.75,0.93])
    hold on
    plot(x,y(i)*ones(lenx),'color',[0.30,0.75,0.93])
end
for i = 1:length(pos)
    text(pos(1,i),pos(2,i),num2str(i),'HorizontalAlignment','center')
end
T = zeros(3,2*(lenx-1)*(leny-1));
for i = 1:(lenx-1)*(leny-1)
    row = ceil(i/(lenx-1));
    list = i - (row - 1) * (lenx - 1);
    % 第 i 个正方形的四个顶点为 x_row x_(row+1) y_list y_(list+1)
    T(1,2*i-1) = (row - 1) * lenx + list;
    T(2,2*i-1) = row * lenx + list;
    T(3,2*i-1) = row * lenx + (list + 1);
    T(1,2*i) = row * lenx + (list + 1);
    T(2,2*i) = (row - 1) * lenx + (list + 1);
    T(3,2*i) = (row - 1) * lenx + list;
    x_pos = (pos(1,T(1,2*i-1))+pos(1,T(2,2*i-1)))/2;
    y_pos = (pos(2,T(2,2*i-1))+pos(2,T(3,2*i-1)))/2;
    text(x_pos,y_pos,[num2str(i),'(',num2str(row+1),',',num2str(list),')'],...
        'HorizontalAlignment','center',...
        'Color','red')
    hold on
    cen_Line=[pos(:,T(1,2*i-1)),pos(:,T(3,2*i-1))];
    plot(cen_Line(1,:),cen_Line(2,:),'color',[0.73,0.88,0.15])
end

set(gca,'XLim',[X(1)-1,X(2)+1],'YLim',[Y(1)-1,Y(2)+1])
axis equal
  • 小结:这个代码中,矩形区域的大小由X,Y控制,你可以随意更改,区间划分采用划分,划分个数分别由 n x , n y nx,ny nx,ny两个参数控制,这两个参数你也可以随意更改。

  • ~~需要注意到的是,在产生网格划分示意图时,标记的字体大小是使用系统默认字体大小,所以当网格划分较密集时,所出现带标记的图像并不好看,你可以将标记文本的代码注释掉。~~如下的图像:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值