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.

61 lines
1.8 KiB

3 years ago
%--------------------------
% @Author: Jingqiao Hu
% @Date: 2021-12-26 23:23:06
% @LastEditTime: 2021-12-29 20:53:27
% for each voronoi cell
% update the MMC variables based on voronoi-edges & nodes
%--------------------------
function [MMCs, MMCs_poly] = update_MMCs(MMCs_edges, MMCs_nodes, t0)
npnts = size(MMCs_edges, 1);
MMCs = cell(npnts, 1);
MMCs_poly = cell(npnts, 1);
% figure;
parfor ele = 1 : npnts
% MMCs variables
edges = MMCs_edges{ele};
nodes = MMCs_nodes{ele};
nodes1 = nodes(edges(:, 1), :);
nodes2 = nodes(edges(:, 2), :);
nodes3 = (nodes1 + nodes2) / 2;
x = nodes3(:,1);
y = nodes3(:,2);
len = vecnorm(nodes2 - nodes1, 2, 2);
sina = abs(nodes2(:,2) - nodes1(:,2)) ./ len;
dir = (nodes2(:,2) < nodes1(:,2)) .* (nodes2(:,1) < nodes1(:,1)) + ...
(nodes2(:,2) > nodes1(:,2)) .* (nodes2(:,1) > nodes1(:,1));
sina(dir < 1) = -sina(dir < 1);
t = repmat(t0, size(edges, 1), 3);
mmc = [t, x, y, len/2, sina]; % [n,7]
MMCs{ele} = mmc;
% the polygon of each MMC
cosa = sqrt(1 - sina.^2);
stepx = t0/2 * abs(sina);
stepy = t0/2 * cosa;
stepy(dir>0) = -stepy(dir>0);
n0 = [nodes1(:,1) - stepx, nodes1(:,2) - stepy]; % [n,2]
n1 = [nodes1(:,1) + stepx, nodes1(:,2) + stepy];
n2 = [nodes2(:,1) + stepx, nodes2(:,2) + stepy];
n3 = [nodes2(:,1) - stepx, nodes2(:,2) - stepy];
poly0 = [n0'; n1'; n2'; n3'];
poly1 = reshape(poly0, 2, 4, []);
MMCs_poly{ele} = permute(poly1, [2,1,3]); % [4,2,n]
% % test polyshape
% for i = 1:size(n0,1)
% n = [n0(i,:); n1(i,:); n2(i,:); n3(i,:)];
% p = polyshape(n);
% plot(p); hold on;
% end
end
end