a 2D version
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

109 lines
3.5 KiB

% get connected eles for every ele
% check down, right, up, left connected eles
function connectEle = checkConnectEle(eles,nodes,eleNum,optNeighbor)
if optNeighbor==4
% down, right, up, left
connectEle = zeros(eleNum,4); % max connect ele = 4
for i = 1:eleNum
node = eles(i,:);
tempEles = eles;
tempEles(i,:) = 0;
connectEle(i,1) = connectThisEle(node(1),node(2),tempEles);
connectEle(i,2) = connectThisEle(node(3),node(2),tempEles);
connectEle(i,3) = connectThisEle(node(3),node(4),tempEles);
connectEle(i,4) = connectThisEle(node(1),node(4),tempEles);
end
else
% 8 dir:
% down, right, up, left, down-left, down-right, up-right, up-left
connectEle = mooreNeighbor(eles,nodes,eleNum);
end
end
% get connected eles for edge(node1,node2)
function ce = connectThisEle(node1,node2,eles)
ce = 0; % no connected ele
compn(:,:,1) = repmat(node1,size(eles));
compn(:,:,2) = repmat(node2,size(eles));
compe = repmat(eles,[1,1,2]);
ifcom = compn==compe;
com = sum(sum(ifcom,3),2); % sum by 3rd dim, by 2nd dim(cols)
if find(com>1)
[ce,~] = find(com>1);
end
end
function ce = connectThisNode(node,eles)
ce = 0;
compn = repmat(node,size(eles));
ifcom = compn==eles;
com = sum(ifcom,2);
if find(com>0)
[ce,~] = find(com>0);
end
end
% get surronding 8 neighbor eles
% down, right, up, left, down-left, down-right, up-right, up-left
function [connectEle] = mooreNeighbor(eles,nodes,eleNum)
connectEle = zeros(eleNum,8); % max connect ele = 8
for i = 1:eleNum
node = eles(i,:);
tempEles = eles;
tempEles(i,:) = 0;
conn = zeros(3*4, 1);
for j = 1:4
ce = connectThisNode(node(j),tempEles);
conn((j-1)*3+1:(j-1)*3+size(ce),1) = ce;
end
conn = setdiff(unique(conn),0);
% the center coordinate of this ele
nodesIdx = eles(i,:);
nodesCoor = nodes(nodesIdx,1:2);
coori = mean(nodesCoor);
% decide the dir by the center coordinate of connected ele
connNum = size(conn);
for j = 1:connNum
nodesIdx = eles(conn(j),:);
nodesCoor = nodes(nodesIdx,1:2);
coorj = mean(nodesCoor); % the center coordinate
if abs(coorj(1)-coori(1))<1e-5
if coorj(2)-coori(2)>1e-5
connectEle(i, 3) = conn(j); % up
else
connectEle(i, 1) = conn(j); % down
end
elseif abs(coorj(2)-coori(2))<1e-5
if coorj(1)-coori(1)>1e-5
connectEle(i, 2) = conn(j); % right
else
connectEle(i, 4) = conn(j); % left
end
elseif coorj(1)-coori(1)>1e-5 && coorj(2)-coori(2)>1e-5
connectEle(i, 7) = conn(j); % up-right
elseif coori(1)-coorj(1)>1e-5 && coorj(2)-coori(2)>1e-5
connectEle(i, 8) = conn(j); % up-left
elseif coori(1)-coorj(1)>1e-5 && coori(2)-coorj(2)>1e-5
connectEle(i, 5) = conn(j); % down-left
elseif coorj(1)-coori(1)>1e-5 && coori(2)-coorj(2)>1e-5
connectEle(i, 6) = conn(j); % down-right
end
end
end
end