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
87 lines
2.9 KiB
3 years ago
|
%--------------------------
|
||
|
% @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
|