你已经派生过 em3d-mt
镜像自地址
https://gitee.com/sduem/em3d-mt.git
已同步 2025-08-03 11:26:50 +08:00
74 行
2.6 KiB
Matlab
74 行
2.6 KiB
Matlab
function [elems2edges, edges2nodes]=get_edges(elems2nodes)
|
|
%function: [element2edges, edge2nodes]=get_edges(elems2nodes)
|
|
%requires: deleterepeatedrows
|
|
%generates edges of (triangular) triangulation defined in elems2nodes
|
|
%elems2nodes is matrix, whose rows contain numbers of its element nodes
|
|
%element2edges returns edges numbers of each triangular element
|
|
%edge2nodes returns two node numbers of each edge
|
|
%example in 2D: [element2edges, edge2nodes]=get_edges([1 2 3; 2 4 3])
|
|
%example in 3D: [element2edges, edge2nodes]=get_edges([1 2 3 4; 1 2 3 5; 1 2 4 6])
|
|
% Liu minghong 20221026
|
|
%2D case
|
|
if (size(elems2nodes,2)==3)
|
|
%extracts sets of edges
|
|
edges1=elems2nodes(:,[2 3]);
|
|
edges2=elems2nodes(:,[3 1]);
|
|
edges3=elems2nodes(:,[1 2]);
|
|
|
|
%as sets of their nodes (vertices)
|
|
vertices=zeros(size(elems2nodes,1)*3,2);
|
|
vertices(1:3:end,:)=edges1;
|
|
vertices(2:3:end,:)=edges2;
|
|
vertices(3:3:end,:)=edges3;
|
|
|
|
%repeated sets of nodes (joint edges) are eliminated
|
|
[edges2nodes,elems2edges]=deleterepeatedrows(vertices);
|
|
elems2edges=reshape(elems2edges,3,size(elems2nodes,1))';
|
|
end
|
|
|
|
%3D case
|
|
if (size(elems2nodes,2)==4)
|
|
%extracts sets of edges
|
|
edges1=elems2nodes(:,[1 2]);
|
|
edges2=elems2nodes(:,[1 3]);
|
|
edges3=elems2nodes(:,[1 4]);
|
|
edges4=elems2nodes(:,[2 3]);
|
|
% edges5=elems2nodes(:,[3 4]);
|
|
% edges6=elems2nodes(:,[4 2]);
|
|
% Liu minghong 20221026
|
|
edges5=elems2nodes(:,[4 2]);
|
|
edges6=elems2nodes(:,[3 4]);
|
|
|
|
%as sets of their nodes (vertices)
|
|
vertices=zeros(size(elems2nodes,1)*6,2);
|
|
vertices(1:6:end,:)=edges1;
|
|
vertices(2:6:end,:)=edges2;
|
|
vertices(3:6:end,:)=edges3;
|
|
vertices(4:6:end,:)=edges4;
|
|
vertices(5:6:end,:)=edges5;
|
|
vertices(6:6:end,:)=edges6;
|
|
|
|
%repeated sets of nodes (joint edges) are eliminated
|
|
[edges2nodes,elems2edges]=deleterepeatedrows(vertices);
|
|
elems2edges=reshape(elems2edges,6,size(elems2nodes,1))';
|
|
% *** 20221026
|
|
edges2nodes=sort(edges2nodes,2);
|
|
|
|
end
|
|
|
|
|
|
function [matrix,I]=deleterepeatedrows(matrix)
|
|
%function: [element2edges, edge2nodes]=edge_numbering(elements)
|
|
%requires: deleterepeatedrows
|
|
%generates edges of (triangular) triangulation defined in elements
|
|
%elements is matrix, whose rows contain numbers of its element nodes
|
|
%element2edges returns edges numbers of each triangular element
|
|
%edge2nodes returns two node numbers of each edge
|
|
%example: [element2edges, edge2nodes]=edge_numbering([1 2 3; 2 4 3])
|
|
|
|
|
|
%fast and short way suggested by John D'Ericco working in both 2D and 3D
|
|
matrixs=sort(matrix,2);
|
|
[dummy,J,I] = unique(matrixs,'rows');
|
|
%I=reshape(I,size(matrixs,2),size(I,1)/size(matrixs,2));
|
|
matrix=matrix(J,:); |