Spaces:
Runtime error
Runtime error
| function [newBox, constraint] = align_adjacent_room3(box, tempBox, updated, type, threshold) | |
| % position of box1 relative to box2 | |
| % 0 left-above | |
| % 1 left-below | |
| % 2 left-of | |
| % 3 above | |
| % 4 inside | |
| % 5 surrounding | |
| % 6 below | |
| % 7 right-of | |
| % 8 right-above | |
| % 9 right-below | |
| newBox = box; | |
| constraint = zeros(4, 2); | |
| idx = 1; | |
| if type == 0 | |
| alignV(true); | |
| alignH(true); | |
| elseif type == 1 | |
| alignV(true); | |
| alignH(false); | |
| elseif type == 2 | |
| align([2,1], [1,3], threshold); | |
| align([2,2], [1,2], threshold/2); | |
| align([2,4], [1,4], threshold/2); | |
| elseif type == 3 | |
| align([2,2], [1,4], threshold); | |
| align([2,1], [1,1], threshold/2); | |
| align([2,3], [1,3], threshold/2); | |
| elseif type == 4 | |
| align([2,1], [1,1], true); | |
| align([2,2], [1,2], true); | |
| align([2,3], [1,3], true); | |
| align([2,4], [1,4], true); | |
| elseif type == 5 | |
| align([1,1], [2,1], true); | |
| align([1,2], [2,2], true); | |
| align([1,3], [2,3], true); | |
| align([1,4], [2,4], true); | |
| elseif type == 6 | |
| align([2,4], [1,2], threshold); | |
| align([2,1], [1,1], threshold/2); | |
| align([2,3], [1,3], threshold/2); | |
| elseif type == 7 | |
| align([2,3], [1,1], threshold); | |
| align([2,2], [1,2], threshold/2); | |
| align([2,4], [1,4], threshold/2); | |
| elseif type == 8 | |
| alignV(false); | |
| alignH(true); | |
| elseif type == 9 | |
| alignV(false); | |
| alignH(false); | |
| end | |
| constraint = constraint(1:idx-1, :); | |
| function alignV(isLeft) | |
| if isLeft | |
| idx1 = 1; | |
| idx2 = 3; | |
| else | |
| idx1 = 3; | |
| idx2 = 1; | |
| end | |
| if abs(tempBox(2,idx1) - tempBox(1,idx2)) <= abs(tempBox(2,idx2) - tempBox(1,idx2)) | |
| align([2,idx1], [1,idx2], threshold/2) | |
| else | |
| align([2,idx2], [1,idx2], threshold/2) | |
| end | |
| end | |
| function alignH(isAbove) | |
| if isAbove | |
| idx1 = 2; | |
| idx2 = 4; | |
| else | |
| idx1 = 4; | |
| idx2 = 2; | |
| end | |
| if abs(tempBox(2,idx1) - tempBox(1,idx2)) <= abs(tempBox(2,idx2) - tempBox(1,idx2)) | |
| align([2,idx1], [1,idx2], threshold/2) | |
| else | |
| align([2,idx2], [1,idx2], threshold/2) | |
| end | |
| end | |
| function align(idx1, idx2, threshold, attach) | |
| if nargin < 4 | |
| attach = false; | |
| end | |
| if abs(tempBox(idx1(1),idx1(2))- tempBox(idx2(1), idx2(2))) <= threshold | |
| if updated(idx1(1), idx1(2)) && ~updated(idx2(1), idx2(2)) | |
| newBox(idx2(1), idx2(2)) = newBox(idx1(1),idx1(2)); | |
| elseif updated(idx2(1), idx2(2)) && ~updated(idx1(1), idx1(2)) | |
| newBox(idx1(1), idx1(2)) = newBox(idx2(1),idx2(2)); | |
| elseif ~updated(idx1(1), idx1(2)) && ~updated(idx2(1), idx2(2)) | |
| if attach | |
| newBox(idx2(1), idx2(2)) = newBox(idx1(1),idx1(2)); | |
| else | |
| y = (newBox(idx1(1),idx1(2)) + newBox(idx2(1), idx2(2)))/2; | |
| newBox(idx1(1),idx1(2)) = y; | |
| newBox(idx2(1), idx2(2)) = y; | |
| end | |
| end | |
| if idx1(1) == 1 | |
| constraint(idx, :) = [idx1(2) idx2(2)]; | |
| else | |
| constraint(idx, :) = [idx2(2) idx1(2)]; | |
| end | |
| idx = idx + 1; | |
| end | |
| end | |
| end |