Zai
test
06db6e9
raw
history blame
1.87 kB
function box = shrink_box(roomPoly, entrancePoly, doorOrient)
[PG, shapeId, ~] = subtract(roomPoly, entrancePoly);
idx1 = find(shapeId==1);
d = idx1(2:end) - idx1(1:end-1);
i = find(d~=1);
if ~isempty(i)
idx1 = idx1([i+1:end 1:i]);
end
idx2 = find(shapeId~=1);
d = idx2(2:end) - idx2(1:end-1);
i = find(d~=1);
if ~isempty(i)
idx2 = idx2([i+1:end 1:i]);
end
remainPoint = length(idx1);
if remainPoint == 2
box = [min(PG.Vertices) max(PG.Vertices)];
elseif remainPoint == 3
assert(length(idx2) == 3);
pointSet1 = PG.Vertices([idx1(1:2); idx2(2)], :);
pointSet2 = PG.Vertices([idx1(2:3); idx2(2)], :);
if mod(doorOrient, 2) == 0 % door grow vertically
if pointSet1(1,1) == pointSet1(2,1)
box = [min(pointSet1) max(pointSet1)];
else
box = [min(pointSet2) max(pointSet2)];
end
else
if pointSet1(1,2) == pointSet1(2,2)
box = [min(pointSet1) max(pointSet1)];
else
box = [min(pointSet2) max(pointSet2)];
end
end
elseif remainPoint == 4
% elseif remainPoint == 4 && length(idx2) == 4
% pointSet = PG.Vertices([idx1(2:3); idx2(2:3)], :);
% box = [min(pointSet) max(pointSet)];
% elseif remainPoint == 4 % door inside the box
[x1, y1] = centroid(roomPoly);
[x2, y2] = centroid(entrancePoly);
box = [min(roomPoly.Vertices) max(roomPoly.Vertices)];
if mod(doorOrient, 2) == 0 % door grow vertically
if x1 < x2
box(3) = min(entrancePoly.Vertices(:,1));
else
box(1) = max(entrancePoly.Vertices(:,1));
end
else
if y1 < y2
box(4) = min(entrancePoly.Vertices(:,2));
else
box(2) = max(entrancePoly.Vertices(:,2));
end
end
else
disp(['There are other cases with point number = ', num2str(length(shapeId))]);
end