%Matlab script %Generates a graph dual for a triangulated graph %J. Hoyal Cuthill 2017 %Code tested for the studied input case only clear all; close all; MarsupitesCalyxMatrix=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0; 1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0; 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0; 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0; 0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0; 0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0; 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0; 0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0; 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0; 0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0; 0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0; 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0]; %lower ajacency matrix representing connected nodes (plates) with 1 MarsupitesCalyxNames={'C1','I1','I2','I3','I4','I5','B1','B2','B3','B4','B5','R1','R2','R3','R4','R5','E1'}; names=MarsupitesCalyxNames; %plate labels Matrix=MarsupitesCalyxMatrix; symmetricM=Matrix'+Matrix; Matrix=symmetricM; %symmetric adjacency matrix Matrix=UintacrinusCalyxMatrix; %symmetric ajacency matrix tf = issymmetric(Matrix) %checks if matrix is symmetric (outputs 1 if true, 0 if false) [rows,columns]=size(Matrix); nodenumbers=[1:rows]; Self=Matrix+diag([ones(1,rows)]); G = graph(Matrix~=0,'lower'); %G = graph(Matrix~=0,names,'lower'); %Matlab format graph figure plot(G); %G.Edges(1) axis equal Gself = graph(Self~=0,'lower'); %Gself = graph(Self~=0,names,'lower'); figure plot(Gself); axis equal L = adj2adjL(Matrix); %node adjacency list S=adj2adjL(Self); %node adjacency list %face dual %find all possible combinations of 3 nodes C = nchoosek(nodenumbers,3); [ntriplets,columns]=size(C); %for each combination check if they are intersecting neighbours clear Facenodes; count=1; for n=1:ntriplets; F = intersect(intersect(S{C(n,1),1},S{C(n,2),1}),S{C(n,3),1}); if length(F)==3; %if yes, allocate face Facenodes(count,:)=F; count=count+1; end end %compare each pair of faces to find neighbours (share an edge): E = nchoosek([1:length(Facenodes)],2); %possible pairs of triangle node sets [ndoublets,columns]=size(E); %for each combination check if they are intersecting neighbours clear dualEdges; countE=1; for n=1:ndoublets; F = intersect(Facenodes(E(n,1),:),Facenodes(E(n,2),:)); if length(F)==2; %if yes, allocate face dualEdges(countE,:)=[E(n,1),E(n,2)]; %the row numbers in Facenodes countE=countE+1; end end nnewnodes=max(max(dualEdges)); dualM=zeros(nnewnodes,nnewnodes); for v=1:length(dualEdges); dualM(dualEdges(v,2),dualEdges(v,1))=1; %lower node adjacency matrix end dualG = graph(dualM~=0,'lower'); %Matlab format graph %hold on figure plot(dualG); axis equal