-
Notifications
You must be signed in to change notification settings - Fork 93
/
rectangle2hypothesis.m
executable file
·135 lines (121 loc) · 5.96 KB
/
rectangle2hypothesis.m
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
function [ objects ] = rectangle2hypothesis( xyzBox, rule, room_points )
%RECTANGLE2HYPOTHESIS Popup rectangles to cuboids
% Detailed explanation goes here
COUNTER_CLOCKWISE = true;
FITTINGRULES;
uni_room_points = zeros(8,3);
uni_room_points(POINTMAPPING{3},1) = room_points(:,1);
uni_room_points(POINTMAPPING{3},2) = room_points(:,2);
uni_room_points(POINTMAPPING{3},3) = room_points(:,3);
I = find(uni_room_points(1:4,1)<0 & uni_room_points(1:4,2)<0);
ID = rem([I I+1 I+2 I+3]-1,4) + 1;
uni_room_points = uni_room_points([ID ID+4],:);
wall_points = zeros(4,3,6);
wall_points(:,:,1) = uni_room_points([1 4 8 5],:);
wall_points(:,:,2) = uni_room_points([3 2 6 7],:);
wall_points(:,:,3) = uni_room_points([2 1 5 6],:);
wall_points(:,:,4) = uni_room_points([4 3 7 8],:);
wall_points(:,:,5) = uni_room_points([1 2 3 4],:);
wall_points(:,:,6) = uni_room_points([8 7 6 5],:);
LRDU_SURF = zeros(6,4);
LRDU_SURF(1,:) = [3 4 5 6];
LRDU_SURF(2,:) = [4 3 5 6];
LRDU_SURF(3,:) = [2 1 5 6];
LRDU_SURF(4,:) = [1 2 5 6];
LRDU_SURF(5,:) = [1 2 4 3];
LRDU_SURF(6,:) = [1 2 3 4];
normals = [1 0 0; -1 0 0; 0 1 0; 0 -1 0; 0 0 1; 0 0 -1];
normal_ids = [1 1 2 2 3 3];
main_angle = [pi/2 -pi/2 -pi 0 0];
objects = repmat(struct('out_points_w',[],'name',[],'type',[],'points',[],'x_w',[]),0,1);
object = struct('out_points_w',[],'name','other','type',[],'points',[],'x_w',zeros(7,1));
xyzBox = reshape(xyzBox', 3, 4)';
%% if left two points in lhs wall, add a hypothesis
[inside,~,~] = insideCone( wall_points(:,:,LRDU_SURF(rule,1)), xyzBox([1 4],:), 0 );
if all(inside)
LID = LRDU_SURF(rule,1);
wall_point = wall_points(:,:,LID);
point4 = LineFaceIntersection(wall_point(1,:), normals(LID,:), [0 0 0], xyzBox(1,:));
point3 = LineFaceIntersection(wall_point(1,:), normals(LID,:), [0 0 0], xyzBox(4,:));
point1 = LineFaceIntersection(point4, normals(rule,:), [0 0 0], xyzBox(2,:));
point2 = LineFaceIntersection(point3, normals(rule,:), [0 0 0], xyzBox(3,:));
point5 = point1; point6 = point2;
point5(normal_ids(rule)) = wall_points(1,normal_ids(rule),rule);
point6(normal_ids(rule)) = wall_points(1,normal_ids(rule),rule);
object.out_points_w = [point1; point2; point3; point4; point5; point6];
object.type = 9;
object.points = object.out_points_w ./ repmat(sqrt(sum(object.out_points_w.^2,2)),1,3);
object.x_w(1:3) = point3;
object.x_w(4) = norm(point2-point3);
object.x_w(5) = norm(point6-point2);
object.x_w(6) = norm(point4-point3);
object.x_w(7) = main_angle(rule);
objects(end+1,1) = object;
end
%% if right two points in rhs wall, add a hypothesis
[inside,~,~] = insideCone( wall_points(:,:,LRDU_SURF(rule,2)), xyzBox([2 3],:), 0 );
if all(inside)
RID = LRDU_SURF(rule,2);
wall_point = wall_points(:,:,RID);
point5 = LineFaceIntersection(wall_point(1,:), normals(RID,:), [0 0 0], xyzBox(2,:));
point6 = LineFaceIntersection(wall_point(1,:), normals(RID,:), [0 0 0], xyzBox(3,:));
point1 = LineFaceIntersection(point5, normals(rule,:), [0 0 0], xyzBox(1,:));
point2 = LineFaceIntersection(point6, normals(rule,:), [0 0 0], xyzBox(4,:));
point4 = point1; point3 = point2;
point4(normal_ids(rule)) = wall_points(1,normal_ids(rule),rule);
point3(normal_ids(rule)) = wall_points(1,normal_ids(rule),rule);
object.out_points_w = [point1; point2; point3; point4; point5; point6];
object.type = 9;
object.points = object.out_points_w ./ repmat(sqrt(sum(object.out_points_w.^2,2)),1,3);
object.x_w(1:3) = point3;
object.x_w(4) = norm(point2-point3);
object.x_w(5) = norm(point6-point2);
object.x_w(6) = norm(point4-point3);
object.x_w(7) = main_angle(rule);
objects(end+1,1) = object;
end
%% if bottom two points in floor, add a hypothesis
[inside,~,~] = insideCone( wall_points(:,:,LRDU_SURF(rule,3)), xyzBox([4 3],:), 0 );
if all(inside)
DID = LRDU_SURF(rule,3);
wall_point = wall_points(:,:,DID);
point3 = LineFaceIntersection(wall_point(1,:), normals(DID,:), [0 0 0], xyzBox(4,:));
point2 = LineFaceIntersection(wall_point(1,:), normals(DID,:), [0 0 0], xyzBox(3,:));
point4 = LineFaceIntersection(point3, normals(rule,:), [0 0 0], xyzBox(1,:));
point1 = LineFaceIntersection(point2, normals(rule,:), [0 0 0], xyzBox(2,:));
point5 = point4; point6 = point1;
point5(normal_ids(rule)) = wall_points(1,normal_ids(rule),rule);
point6(normal_ids(rule)) = wall_points(1,normal_ids(rule),rule);
object.out_points_w = [point1; point2; point3; point4; point5; point6];
object.type = 13;
object.points = object.out_points_w ./ repmat(sqrt(sum(object.out_points_w.^2,2)),1,3);
object.x_w(1:3) = point3;
object.x_w(4) = norm(point2-point3);
object.x_w(5) = norm(point5-point4);
object.x_w(6) = norm(point4-point3);
object.x_w(7) = main_angle(rule);
objects(end+1,1) = object;
end
%% if all four points inside the wall, add a rectangle
[inside,~,~] = insideCone( wall_points(:,:,rule), xyzBox, 0 );
if all(inside)
wall_point = wall_points(:,:,rule);
point4 = LineFaceIntersection(wall_point(1,:), normals(rule,:), [0 0 0], xyzBox(1,:));
point1 = LineFaceIntersection(wall_point(1,:), normals(rule,:), [0 0 0], xyzBox(2,:));
point2 = LineFaceIntersection(wall_point(1,:), normals(rule,:), [0 0 0], xyzBox(3,:));
point3 = LineFaceIntersection(wall_point(1,:), normals(rule,:), [0 0 0], xyzBox(4,:));
point5 = point4;
point8 = point1;
point7 = point2;
point6 = point3;
object.out_points_w = [point1; point2; point3; point4; point5; point6; point7; point8];
object.type = 1;
object.points = object.out_points_w ./ repmat(sqrt(sum(object.out_points_w.^2,2)),1,3);
object.x_w(1:3) = point3;
object.x_w(4) = norm(point2-point3);
object.x_w(5) = norm(point7-point2);
object.x_w(6) = norm(point4-point3);
object.x_w(7) = main_angle(rule);
objects(end+1,1) = object;
end
end