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
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
|