4 from __future__
import division
10 def __init__(self, point1, point2, angular_cluster, spatial_cluster):
31 for line
in extended_lines:
33 if line.angular_cluster == 0:
34 point2 = np.array([x_max, line.point[1]])
35 seg =
ExtendedSegment(line.point, point2, line.angular_cluster, line.spatial_cluster)
36 extended_seg.append(seg)
38 elif line.angular_cluster == math.radians(90):
39 point2 = np.array([line.point[0], y_max])
40 seg =
ExtendedSegment(line.point, point2, line.angular_cluster, line.spatial_cluster)
41 extended_seg.append(seg)
44 m = math.tan(line.angular_cluster)
45 q = line.point[1] - (m*line.point[0])
46 y_for_x_min = m * x_min + q
47 y_for_x_max = m * x_max + q
48 x_for_y_min = (y_min - q) / m
49 x_for_y_max = (y_max - q) / m
50 if line.angular_cluster < 0
or line.angular_cluster * 180/math.pi > 90:
51 if y_max < y_for_x_min:
52 point1 = np.array([x_for_y_max, y_max])
54 point1 = np.array([x_min, y_for_x_min])
55 if y_min > y_for_x_max:
56 point2 = np.array([x_for_y_min, y_min])
58 point2 = np.array([x_max, y_for_x_max])
60 if y_for_x_min > y_min:
61 point1 = np.array([x_min, y_for_x_min])
63 point1 = np.array([x_for_y_min, y_min])
64 if y_for_x_max < y_max:
65 point2 = np.array([x_max, y_for_x_max])
67 point2 = np.array([x_for_y_max, y_max])
68 seg =
ExtendedSegment(point1, point2, line.angular_cluster, line.spatial_cluster)
69 extended_seg.append(seg)
70 point1 = np.array([x_min, y_min])
71 point2 = np.array([x_min, y_max])
72 point3 = np.array([x_max, y_max])
73 point4 = np.array([x_max, y_min])
78 extended_seg.extend((seg1, seg2, seg3, seg4))
87 if edge.angular_cluster == 0:
88 point1 = np.array([x_min, edge.y1])
89 point2 = np.array([x_max, edge.y1])
91 elif edge.angular_cluster == math.radians(90):
92 point1 = np.array([edge.x1, y_min])
93 point2 = np.array([edge.x1, y_max])
96 m = math.tan(edge.angular_cluster)
97 q = edge.y1 - (m * edge.x1)
98 y_for_x_min = m * x_min + q
99 y_for_x_max = m * x_max + q
100 x_for_y_min = (y_min - q) / m
101 x_for_y_max = (y_max - q) / m
102 if edge.angular_cluster < 0
or edge.angular_cluster * 180 / math.pi > 90:
103 if y_max < y_for_x_min:
104 point1 = np.array([x_for_y_max, y_max])
106 point1 = np.array([x_min, y_for_x_min])
107 if y_min > y_for_x_max:
108 point2 = np.array([x_for_y_min, y_min])
110 point2 = np.array([x_max, y_for_x_max])
112 if y_for_x_min > y_min:
113 point1 = np.array([x_min, y_for_x_min])
115 point1 = np.array([x_for_y_min, y_min])
116 if y_for_x_max < y_max:
117 point2 = np.array([x_max, y_for_x_max])
119 point2 = np.array([x_for_y_max, y_max])
121 line =
ExtendedSegment(point1, point2, edge.angular_cluster, edge.spatial_cluster)
122 extended_lines.append(line)
123 return extended_lines
135 for seg
in extended_segments:
136 angular_cluster = seg.angular_cluster
137 if angular_cluster
not in ang:
138 ang.append(angular_cluster)
141 for s
in extended_segments:
142 if s.angular_cluster == a:
149 m = seg1.angular_cluster
151 q1 = (-m * seg1.x1 + seg1.y1)
152 q_p = (-m_perp * seg2.x1 + seg2.y1)
153 x = (q1 - q_p) / (m_perp - m)
154 y = (m_perp * x) + q_p
155 distance = math.sqrt((seg2.x1 - x)*(seg2.x1 - x) + (seg2.x1 - y)*(seg2.x1 - y))
160 if segment1.x2 - segment1.x1 == 0:
161 distance = math.fabs(segment1.x1 - x1)
163 m = (segment1.y2 - segment1.y1)/(segment1.x2 - segment1.x1)
164 q = -m*segment1.x1 + segment1.y1
165 distance = math.fabs(y1 - m*x1 - q)/math.sqrt(1 + m*m)
173 for i1, segment1
in enumerate(extended_segments):
174 for i2
in range(i1+1, len(extended_segments)):
175 segment2 = extended_segments[i2]
177 if segment1.angular_cluster == segment2.angular_cluster:
179 if real_distance < distance:
181 if len(merged_segments) == 0:
182 merged_segments.append([segment1, segment2])
187 for i, elem
in enumerate(merged_segments):
201 if index_1 == index_2 == -1:
202 merged_segments.append([segment1, segment2])
203 if index_1 == -1
and index_2 != -1:
204 merged_segments[index_2].append(segment1)
205 if index_1 != -1
and index_2 == -1:
206 merged_segments[index_1].append(segment2)
207 if index_1 != index_2
and index_1 != -1
and index_2 != -1:
208 cluster1 = merged_segments[index_1]
209 cluster2 = merged_segments[index_2]
210 cluster3 = cluster1 + cluster2
211 merged_segments.remove(cluster1)
212 merged_segments.remove(cluster2)
213 merged_segments.append(cluster3)
217 return merged_segments
222 if wall.spatial_cluster == seg2.spatial_cluster:
223 wall.set_spatial_cluster(seg1.spatial_cluster)
228 extended_segments_v2 = []
229 for seg
in extended_segments:
230 if seg.angular_cluster
is not None:
231 extended_segments_v2.append(seg)
238 merged_segments = merged_segments + cl
240 for cluster
in merged_segments:
242 cluster.sort(key=sort_weight, reverse=
True)
243 for j1, seg1
in enumerate(cluster):
244 for j2
in range(j1+1, len(cluster)):
246 if not (seg1
is None or seg2
is None):
250 seg_to_remove.append(seg2)
252 for seg
in seg_to_remove:
254 extended_segments_v2.remove(seg)
256 print(
'segment already removed')
257 for seg
in extended_segments:
259 if seg.angular_cluster
is None:
260 extended_segments_v2.append(seg)
262 print(
'segment already removed')
263 return extended_segments_v2