File size: 1,980 Bytes
06db6e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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