Spaces:
Runtime error
Runtime error
| 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 |