Spaces:
Runtime error
Runtime error
function [box, order] = regularize_fp(box, boundary, rType) | |
% 1. use the boundary to crop each room box | |
isNew = boundary(:,4); | |
polyBoundary = polyshape(boundary(~isNew,1), boundary(~isNew,2)); | |
for i = 1:size(box, 1) | |
polyRoom = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2])); | |
[xLimit, yLimit] = boundingbox(intersect(polyBoundary,polyRoom)); | |
if isempty(xLimit) | |
disp('One room outside the building!'); | |
else | |
box(i,:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)]; | |
end | |
end | |
% 2. check if there is any overlapped region to determine the layer of boxes | |
orderM = false(size(box,1), size(box,1)); | |
for i = 1:size(box,1) | |
polyRoom1 = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2])); | |
area1 = area(polyRoom1); | |
for j = i+1:size(box,1) | |
polyRoom2 = polyshape(box(j, [1 1 3 3]), box(j, [2 4 4 2])); | |
area2 = area(polyRoom2); | |
inter = intersect(polyRoom1, polyRoom2); | |
if inter.NumRegions >= 1 | |
if area1 <= area2 % may need to add the FP into consideration | |
orderM(i,j) = true; | |
else | |
orderM(j,i) = true; | |
end | |
end | |
end | |
end | |
order = 1:size(box,1); | |
if any(orderM(:)) | |
order = find_room_order(orderM); | |
end | |
order = order(end:-1:1); | |
% 3. check if there are more than one uncovered regions inside the building | |
livingIdx = find(rType==0); | |
for i = 1:size(box, 1) | |
if i ~= livingIdx | |
if box(i,1)==box(i,3) || box(i,2)==box(i,4) | |
disp('Empty box!!!'); | |
else | |
polyRoom = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2])); | |
polyBoundary = subtract(polyBoundary,polyRoom); | |
end | |
end | |
end | |
livingPoly = polyshape(box(livingIdx, [1 1 3 3]), box(livingIdx, [2 4 4 2])); | |
gap = polyBoundary; | |
if gap.NumRegions == 1 | |
[xLimit, yLimit] = boundingbox(gap); | |
box(livingIdx,:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)]; | |
else | |
rIdx = find(isnan(gap.Vertices(:,1))); | |
rIdx = [rIdx; size(gap.Vertices,1)+1]; | |
% for each region, check if it intersects with the living room, | |
% otherwise get the room label and find the room that should cover | |
% the region | |
region = cell(length(rIdx), 1); | |
overlapArea = zeros(length(rIdx), 1); | |
closeRoomIdx = zeros(length(rIdx), 1); | |
idx = 1; | |
for k = 1:length(rIdx) | |
regionV = gap.Vertices(idx:rIdx(k)-1, :); | |
idx = rIdx(k) + 1; | |
region{k} = polyshape(regionV); | |
if overlaps(region{k}, livingPoly) | |
iter = intersect(region{k}, livingPoly); | |
overlapArea(k) = area(iter); | |
end | |
[x, y] = centroid(region{k}); | |
center = [x, y]; | |
dist = 256; | |
bIdx = 0; | |
for i = 1:size(box, 1) | |
b = box(i, :); | |
bCenter = double([(b(:,1)+b(:,3))/2, (b(:,2)+b(:,4))/2]); | |
d = norm(bCenter-center); | |
if d<dist | |
dist = d; | |
bIdx = i; | |
end | |
end | |
closeRoomIdx(k) = bIdx; | |
end | |
[~, lIdx] = max(overlapArea); | |
for k = 1:length(closeRoomIdx) | |
if k == lIdx | |
[xLimit, yLimit] = boundingbox(region{k}); | |
box(livingIdx,:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)]; | |
else | |
room = polyshape(box(closeRoomIdx(k), [1 1 3 3]), box(closeRoomIdx(k), [2 4 4 2])); | |
[xLimit, yLimit] = boundingbox(union(room, region{k})); | |
box(closeRoomIdx(k),:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)]; | |
end | |
end | |
end | |