%-------------------------- % @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