%-------------------------- % @Author: Jingqiao Hu % @Date: 2021-11-30 11:16:16 % @LastEditTime: 2022-01-08 22:36:10 %-------------------------- function [edofMat, nvar, nodes] = assembleInfo_cvt(c_vedges, nbridge_each, nbnodes_cell) ncvt = size(c_vedges, 1); nodes0 = []; cbns_cell = cell(ncvt, 1); % step.1 transverse all nodes, generate unique nodes % generate bezier control nodes for the following step for ele = 1 : ncvt vedges = c_vedges{ele}; cbns = []; nbele = nbnodes_cell{ele} - 1; % for those three situations for i = 1 : size(vedges, 1) n1 = vedges(i, 1:2); n2 = vedges(i, 3:4); step = (n2 - n1) / (nbridge_each + 1); if i == 1 cbns = [cbns; n1]; end nb_edge = nbele(i); % 1. nb_edge = 1, without additional nodes % 2. nb_edge = 2, add one control node if nb_edge == 2 n11 = (n1+n2) / 2; cbns = [cbns; n11]; elseif nb_edge > 2 % 3. nb_edge = 3, add control nodes as usual % TODO: update in the future assert(nbridge_each + 1 <= nb_edge); for j = 1 : nbridge_each + 1 % the segment num of one edge % the two control pnts n11 = step * 1/3 + n1 + step * (j-1); n12 = step * 2/3 + n1 + step * (j-1); % additional bridge nodes if j==nbridge_each+1 nbnode = []; else nbnode = j * step + n1; end % add these nodes cbns = [cbns; n11; n12; nbnode]; end end if i < size(vedges, 1) cbns = [cbns; n2]; end end cbns_cell{ele} = cbns; nodes0 = [nodes0; cbns]; % figure; scatter(cbns(:,1), cbns(:,2)); end nodes = unique(nodes0, 'rows'); % NOTE: the order changed nvar = size(nodes,1) * 2; % figure; hold on; scatter(nodes(:,1), nodes(:,2)); % figure; % step.2 each cvt-i, check each nodes on global edofMat = cell(ncvt, 1); for ele = 1 : ncvt cbns_local = cbns_cell{ele}; [~, idx] = ismember(cbns_local, nodes, 'rows'); % NOTE: the sequence must conforms to Ke edof0 = [2*idx-1, 2*idx]'; edofMat{ele} = edof0(:); end end