求助:Matlab生成带壁厚的不规则蜂窝轮廓端点坐标与连通性
生成带壁厚的不规则蜂窝轮廓端点坐标与连通关系
针对你已有的蜂窝中心线节点和连通关系,通过中心线偏移+节点去重+重建连通关系的方式,可得到带壁厚的蜂窝轮廓的端点坐标及连通关系,具体实现如下:
关键逻辑说明
- 偏移距离计算:蜂窝壁夹角为60°,壁厚
Th对应的偏移距离为r = Th/(2*sind(60)),确保偏移后的两条线间距恰好为设定壁厚 - 轮廓节点生成:对每条中心线边,生成其两侧的四个轮廓端点
- 节点去重:不同中心线边的相邻轮廓端点会重合,通过
unique函数合并重复节点,得到唯一的轮廓节点列表 - 连通关系重建:根据去重后的节点ID,重新建立轮廓边的连通关系
修改后的完整代码
clc close all clear format long g %% Control Parameters L = 7; Nx = 4; % 水平方向单元数 Ny = 2; % 垂直方向单元对数 Th = 2; % 壁厚 %% 生成蜂窝中心线拓扑(含局部缺陷) [nodes, elems] = CreateHoneycombTopology(L, Nx, Ny); nodes(30,2:3) = [nodes(30,2)+2, nodes(30,3)-1]; % 添加局部缺陷 %% 生成轮廓节点与连通关系 r = Th/(2*sind(60)); temp_contour_nodes = []; % 临时存储所有轮廓节点(含重复) temp_contour_elems = []; % 临时存储轮廓边的原始节点索引 for cont1 = 1:size(elems,1) x1 = nodes(elems(cont1,2),2); x2 = nodes(elems(cont1,3),2); y1 = nodes(elems(cont1,2),3); y2 = nodes(elems(cont1,3),3); dx = x2-x1; dy = y2-y1; phi = atan2d(dy,dx); % 生成当前中心线边对应的四个轮廓端点 nx1 = x1 + r*cosd(phi-60); ny1 = y1 + r*sind(phi-60); nx2 = x2 + r*cosd(phi+240); ny2 = y2 + r*sind(phi+240); mx1 = x1 + r*cosd(phi+60); my1 = y1 + r*sind(phi+60); mx2 = x2 + r*cosd(phi+120); my2 = y2 + r*sind(phi+120); % 将四个节点加入临时列表,记录当前边对应的两条轮廓边 node_ids = size(temp_contour_nodes,1) + [1,2,3,4]; temp_contour_nodes = [temp_contour_nodes; nx1 ny1; nx2 ny2; mx1 my1; mx2 my2]; temp_contour_elems = [temp_contour_elems; node_ids(1) node_ids(2); node_ids(3) node_ids(4)]; end % 去重得到唯一轮廓节点列表 [contour_nodes, ~, idx] = unique(temp_contour_nodes, 'rows'); contour_nodes = [[1:size(contour_nodes,1)]', contour_nodes]; % 添加节点ID % 重建轮廓边的连通关系(映射到去重后的节点ID) contour_elems = []; for i = 1:size(temp_contour_elems,1) id1 = idx(temp_contour_elems(i,1)); id2 = idx(temp_contour_elems(i,2)); contour_elems = [contour_elems; i, id1, id2]; end %% 可视化验证 figure hold on % 绘制轮廓边 for i = 1:size(contour_elems,1) plot(contour_nodes(contour_elems(i,2:3),2), contour_nodes(contour_elems(i,2:3),3), 'b-', 'LineWidth',1.5); end % 绘制轮廓端点 plot(contour_nodes(:,2), contour_nodes(:,3), 'ro', 'MarkerSize',5); axis equal axis padded title('带壁厚的不规则蜂窝轮廓'); %% 蜂窝中心线拓扑生成函数 function [nodes,elems] = CreateHoneycombTopology(L,Nx,Ny) %% 生成壁单元 X1 = [0:Ny].*3; X2 = X1+1; X3 = [0:Ny+1].*3-0.5; X4 = X2+0.5; nodes = []; elems = []; nid = 0; nel = 0; for m=0:Nx-1 gap=sqrt(3); step=[m m]*sqrt(3); for n=1:length(X1)-1 [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,[0 0]*gap+step ,[X1(n) X2(n)]); [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,[0.5 0.5]*gap+step,[X3(n+1) X4(n)]); [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,[0 0.5]*gap+step ,[X2(n) X4(n)]); [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,[0 0.5]*gap+step ,[X1(n+1) X3(n+1)]); [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,[0.5 1]*gap+step ,[X3(n+1) X1(n+1)]); [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,[0.5 1]*gap+step ,[X4(n) X2(n)]); end end for n=1:length(X1)-1 [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,[1 1]*gap+step,[X1(n) X2(n)]); end %% 移除重复节点 temp = unique(nodes(:,2:3),'rows'); temp = [[1:size(temp,1)].',temp]; for cont1 = 1:size(elems,1) id = temp(ismember(temp(:,2:3),nodes(elems(cont1,2),2:3),'rows'),1); elems(cont1,2) = id; id = temp(ismember(temp(:,2:3),nodes(elems(cont1,3),2:3),'rows'),1); elems(cont1,3) = id; end nodes = temp; %% 缩放节点 nodes(:,2:3) = nodes(:,2:3).*L; end %% 更新节点与单元数组的函数 function [nodes,elems,nid,nel] = UpdateArrays(nodes,elems,nid,nel,x,y) x1 = x(1); x2 = x(2); y1 = y(1); y2 = y(2); nel = nel+1; nid = nid+1; nodes = [nodes;nid,x1,y1]; elems = [elems;nel,nid,nid+1]; nid = nid+1; nodes = [nodes;nid,x2,y2]; end
输出说明
contour_nodes:N×3矩阵,第一列为节点ID,第二、三列为x、y坐标(所有唯一的轮廓端点)contour_elems:M×3矩阵,第一列为边ID,第二、三列为该边连接的两个节点ID(轮廓的连通关系)
内容的提问来源于stack exchange,提问作者Juan David Navarro
相关产品推荐
相关产品推荐

