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.
 
 
 
 

91 lines
3.5 KiB

%--------------------------
% @Author: Jingqiao Hu
% @Date: 2022-01-26 20:58:50
% @LastEditTime: 2022-05-09 20:59:08
% PARAS:
% INPUT:
% indices: the query indices of seeds
% OUTPUT:
% c_edges: voronoi edges for each seed
% cneP: centorid point for each v-cell
% vedges: all edges of the cvt, for the following MMC steps
% c_nnbEdgeIDX: the corresponding edge-idx in vedges1 for each seed
% c_nnbSeedIDX: neighbor seed-idx for each edge
%--------------------------
function [c_edges, cenP, vedges1, c_nnbEdgeIDX, c_nnbSeedIDX] = intersection_info(...
seeds, indices, nelx, nely, nelz, microx,optDesign)
globalx = nelx * microx;
globaly = nely * microx;
globalz = nelz * microx;
if strcmp(optDesign,'cantilever_hole')
[c_edges, cenP] = mexVD_file(seeds, indices(:), globalx, globaly, globalz);
else
[c_edges, cenP] = mexVD(seeds, indices(:), globalx, globaly, globalz);
end
npnts = length(indices);
vedges0 = [];
seedidx = [];
parfor i = 1 : npnts
e = c_edges{i};
vedges0 = [vedges0; e];
seedidx = [seedidx; repmat(indices(i), size(e, 1), 1)];
end
vedges1 = unique_edges(vedges0);
% figure;
% x = vedges1(:,[1,4]);
% y = vedges1(:,[2,5]);
% z = vedges1(:,[3,6]);
% plot3(x',y',z','LineWidth',2); hold on;
% scatter3(seeds(indices,1), seeds(indices,2), seeds(indices,3), 'filled');
eps = 1e-5;
c_nnbEdgeIDX = cell(npnts, 1);
parfor i = 1 : npnts
ei = c_edges{i}; % n*6
edgeid = zeros(size(ei, 1), 1);
for j = 1 : size(ei, 1)
[ej, ~] = find((abs(vedges1(:,1)-ei(j,1)) < eps & abs(vedges1(:,2)-ei(j,2)) < eps & abs(vedges1(:,3)-ei(j,3)) < eps & ...
abs(vedges1(:,4)-ei(j,4)) < eps & abs(vedges1(:,5)-ei(j,5)) < eps & abs(vedges1(:,6)-ei(j,6)) < eps ) | ...
(abs(vedges1(:,4)-ei(j,1)) < eps & abs(vedges1(:,5)-ei(j,2)) < eps & abs(vedges1(:,6)-ei(j,3)) < eps & ...
abs(vedges1(:,1)-ei(j,4)) < eps & abs(vedges1(:,2)-ei(j,5)) < eps & abs(vedges1(:,3)-ei(j,6)) < eps ) );
assert(~isempty(ej));
if length(ej) > 1
% find the nearest one
dist = vecnorm(vedges1(ej, :) - ei(j, :), 2, 2);
[~, r] = min(dist);
ej = ej(r);
end
edgeid(j) = ej;
end
c_nnbEdgeIDX{i} = edgeid;
end
nedge = size(vedges1, 1);
c_nnbSeedIDX = cell(nedge, 1); % neighbor seed-idx for each edge
parfor i = 1 : nedge
ei = vedges1(i, :);
[si, ~] = find((abs(vedges0(:,1)-ei(1)) < eps & abs(vedges0(:,2)-ei(2)) < eps & abs(vedges0(:,3)-ei(3)) < eps & ...
abs(vedges0(:,4)-ei(4)) < eps & abs(vedges0(:,5)-ei(5)) < eps & abs(vedges0(:,6)-ei(6)) < eps ) | ...
(abs(vedges0(:,4)-ei(1)) < eps & abs(vedges0(:,5)-ei(2)) < eps & abs(vedges0(:,6)-ei(3)) < eps & ...
abs(vedges0(:,1)-ei(4)) < eps & abs(vedges0(:,2)-ei(5)) < eps & abs(vedges0(:,3)-ei(6)) < eps ) );
c_nnbSeedIDX{i} = seedidx(si);
end
% % test
% figure(4); clf
% for i = 1 : nedge
% % voronoi(seeds(:,1), seeds(:,2)); hold on;
%
% si = c_nnbSeedIDX{i};
% scatter3(seeds(si,1), seeds(si,2), seeds(si,3), 'filled'); hold on;
%
% plot3(vedges1(i,[1,4]), vedges1(i,[2,5]), vedges1(i,[3,6])); hold on;
% end
end