3 from scipy.spatial
import ConvexHull
25 return 0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))
29 return (math.atan2(x[0], x[1]) + 2 * math.pi) % (2 * math.pi)
33 return [a[0] + corner[0], a[1] + corner[1]]
38 return -1 * vector[1], vector[0]
43 dis_0_to_1 = math.sqrt((pt0[0] - pt1[0]) ** 2 + (pt0[1] - pt1[1]) ** 2)
44 return (pt1[0] - pt0[0]) / dis_0_to_1, (pt1[1] - pt0[1]) / dis_0_to_1
48 unit_vector_p = Segment.unit_vector(hull[index, :], hull[index + 1, :])
49 unit_vector_o = Segment.orthogonal_vector(unit_vector_p)
51 dis_p = tuple(np.dot(unit_vector_p, pt)
for pt
in hull)
52 dis_o = tuple(np.dot(unit_vector_o, pt)
for pt
in hull)
56 len_p = max(dis_p) - min_p
57 len_o = max(dis_o) - min_o
59 return {
'area': len_p * len_o,
60 'length_parallel': len_p,
61 'length_orthogonal': len_o,
62 'rectangle_center': (min_p + len_p / 2, min_o + len_o / 2),
63 'unit_vector': unit_vector_p,
64 'orthogonal_vector': unit_vector_o
76 diff = tuple([pt[d] - center_of_rotation[d]
for d
in range(2)])
77 diff_angle = math.atan2(diff[1], diff[0]) + angle
78 ang.append(diff_angle)
79 diff_length = math.sqrt(sum([d ** 2
for d
in diff]))
80 rot_points.append((center_of_rotation[0] + diff_length * math.cos(diff_angle),
81 center_of_rotation[1] + diff_length * math.sin(diff_angle)))
88 normd = vec - np.average(vec, axis=0)
89 k = np.apply_along_axis(Segment.sorting_criterion, axis=1, arr=normd)
96 angle_orthogonal = unit_vector_angle + math.pi / 2
97 return point[0] * math.cos(unit_vector_angle) + point[1] * math.cos(angle_orthogonal), \
98 point[0] * math.sin(unit_vector_angle) + point[1] * math.sin(angle_orthogonal)
106 for i2
in (i1, -1 * i1):
107 corner_points.append((rectangle[
'rectangle_center'][0] + i1 * rectangle[
'length_parallel'],
108 rectangle[
'rectangle_center'][1] + i2 * rectangle[
'length_orthogonal']))
110 r_points = Segment.rotate_points(rectangle[
'rectangle_center'], rectangle[
'unit_vector_angle'], corner_points)
112 asort = set(r_points)
113 local_poly = np.array(list(asort))
114 local_poly = np.column_stack((local_poly[:, 0], local_poly[:, 1]))
115 local_poly_sort = Segment.sorted_rect(local_poly)
117 local_poly_sort = np.append(local_poly_sort, [local_poly_sort[0, :]], axis=0)
118 return local_poly_sort
123 corners = np.array([[0.5, 0.5],
127 for corner
in corners:
128 new = np.apply_along_axis(Segment.compute_corner, 1, self.
cells, corner = corner)
133 hull_ordered.append(hull_ordered[0])
139 min_rectangle = Segment.bounding_area(0, self.
convex_hull)
142 rectangle = Segment.bounding_area(i, self.
convex_hull)
143 if rectangle[
'area'] < min_rectangle[
'area']:
144 min_rectangle = rectangle
146 min_rectangle[
'unit_vector_angle'] = math.atan2(min_rectangle[
'unit_vector'][1],
147 min_rectangle[
'unit_vector'][0])
148 min_rectangle[
'rectangle_center'] = Segment.to_xy_coordinates(min_rectangle[
'unit_vector_angle'],
149 min_rectangle[
'rectangle_center'])
153 self.
center = min_rectangle[
'rectangle_center']
157 if min_rectangle[
'length_parallel'] < min_rectangle[
'length_orthogonal']: