function [closedSeg, distSeg, idx] = find_close_seg(box, boundary) % need to carefully select the closed wall seg for each box % cannot introduce a hole inside the boundary isNew = boundary(:,4); boundary = double(boundary(~isNew, :)); % get the ordered horizontal and vertical segments on the boundary bSeg = [boundary(:, 1:2), boundary([2:end 1], 1:2), boundary(:,3)]; vSeg = bSeg(mod(boundary(:,3), 2)==1, :); vSeg(vSeg(:,5)==3, [2 4]) = vSeg(vSeg(:,5)==3, [4 2]); [~, I] = sort(vSeg(:,1)); vSeg = vSeg(I,:); hSeg = bSeg(mod(boundary(:,3), 2)==0, :); hSeg(hSeg(:,5)==2, [1 3]) = hSeg(hSeg(:,5)==2, [3 1]); [~, I] = sort(hSeg(:,2)); hSeg = hSeg(I,:); closedSeg = ones(1,4)*256; distSeg = ones(1,4)*256; idx = zeros(1, 4); % check vertial seg for i = 1:size(vSeg,1) seg = vSeg(i, :); vdist = 0; if seg(4) <= box(2) vdist = box(2) - seg(4); elseif seg(2) >= box(4) vdist = seg(2) - box(4); end hdist = box([1 3]) - seg(1); dist1 = norm(double([hdist(1), vdist])); dist3 = norm(double([hdist(2), vdist])); if dist1 < distSeg(1) && dist1 <= dist3 && hdist(1) > 0 distSeg(1) = dist1; idx(1) = i; closedSeg(1) = seg(1); elseif dist3 < distSeg(3) && hdist(2) < 0 distSeg(3) = dist3; idx(3) = i; closedSeg(3) = seg(3); end end % check horizontal seg for i = 1:size(hSeg,1) seg = hSeg(i, :); hdist = 0; if seg(3) <= box(1) hdist = box(1) - seg(3); elseif seg(1) >= box(3) hdist = seg(1) - box(3); end vdist = box([2 4]) - seg(2); dist2 = norm(double([vdist(1), hdist])); dist4 = norm(double([vdist(2), hdist])); if dist2 <= dist4 && dist2 < distSeg(2) && vdist(1) > 0 distSeg(2) = dist2; idx(2) = i; closedSeg(2) = seg(2); elseif dist4 < distSeg(4) && vdist(2) < 0 distSeg(4) = dist4; idx(4) = i; closedSeg(4) = seg(4); end end