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.
 
 
 
 

87 lines
2.9 KiB

%--------------------------
% @Author: Jingqiao Hu
% @Date: 2022-01-13 00:10:54
% @LastEditTime: 2022-01-18 19:53:15
%--------------------------
function seeds = quadtree_nonregular(rho, cpnts, maxx, minx, maxy, miny, maxz, minz, microx, eps)
% 2. compute faces-center points & rho
% 3. divide into block with min-size/10
% while any block>min-size:
% divide the into 4
min_size = microx / 2;
max_size = microx / 1;
%% bounding box and divide into block with max-size
decomp_info = [];
for i = minx : max_size : maxx-max_size
x = [i, i + max_size];
for j = miny : max_size : maxy-max_size
y = [j, j + max_size];
for k = minz : max_size : maxz-max_size
z = [k, k + max_size];
[idx, ~] = find(cpnts(:, 1) <= x(2) & cpnts(:, 1) >= x(1) & ...
cpnts(:, 2) <= y(2) & cpnts(:, 2) >= y(1) & ...
cpnts(:, 3) <= z(2) & cpnts(:, 3) >= z(1));
if ~isempty(idx)
rho_info = mean(rho(idx));
decomp_info = [decomp_info; [rho_info, i,j,k, max_size]];
end
end
end
end
%% quadtree
flag = 1;
while (any(decomp_info(:,1) > eps) || any(decomp_info(:,4) > min_size)) && flag
flag = 0;
[r, ~] = find(decomp_info(:,1) > eps);
for ri = 1:length(r)
di = decomp_info(r(ri), :);
cur_size = di(end);
if cur_size > min_size
flag = 1;
step = cur_size / 2;
decomp_info(r(ri), 1) = -1;
for i = di(2) : step : di(2) + cur_size - step
x = [i, i+step];
for j = di(3) : step : di(3) + cur_size - step
y = [j, j+step];
for k = di(4) : step : di(4) + cur_size - step
z = [k, k+step];
[idx, ~] = find(cpnts(:, 1) <= x(2) & cpnts(:, 1) >= x(1) & ...
cpnts(:, 2) <= y(2) & cpnts(:, 2) >= y(1) & ...
cpnts(:, 3) <= z(2) & cpnts(:, 3) >= z(1));
if ~isempty(idx)
rho_info = mean(rho(idx));
decomp_info = [decomp_info; [rho_info, i,j,k, step]];
end
end
end
end
end
end
end
decomp_info = decomp_info(decomp_info(:,1)>0,:);
step = decomp_info(:,end)/2;
seeds = [decomp_info(:,2) + step, decomp_info(:,3) + step, decomp_info(:,4) + step];
% figure; scatter3(seeds(:,1), seeds(:,2), seeds(:,3), 'filled'); axis equal;
% view([10 25]);
% xlabel('x axis');
% ylabel('y axis');
% zlabel('z axis');
end