Spaces:
Runtime error
Runtime error
| import math | |
| from shapely.geometry import Polygon | |
| def poly_iou(poly1: Polygon, poly2: Polygon): | |
| try: | |
| intersection_area = poly1.intersection(poly2).area | |
| union_area = poly1.union(poly2).area | |
| return intersection_area / union_area | |
| except Exception: | |
| poly1 = poly1.buffer(1) | |
| poly2 = poly2.buffer(1) | |
| intersection_area = poly1.intersection(poly2).area | |
| union_area = poly1.union(poly2).area | |
| return intersection_area / union_area | |
| def is_clockwise_or_not(points): | |
| s = 0 | |
| for i in range(0, len(points) - 1): | |
| s += points[i][0] * points[i + 1][1] - points[i][1] * points[i + 1][0] | |
| return s > 0 | |
| def x_axis_angle(y): | |
| # 以图像坐标系为准,(1,0)方向记为0度,逆时针绕一圈到360度 | |
| # print('-------------') | |
| # print(y) | |
| y_right_hand = (y[0], -y[1]) | |
| # print(y_right_hand) | |
| x = (1, 0) | |
| inner = x[0] * y_right_hand[0] + x[1] * y_right_hand[1] | |
| # print(inner) | |
| y_norm2 = (y_right_hand[0] ** 2 + y_right_hand[1] ** 2) ** 0.5 | |
| # print(y_norm2) | |
| cosxy = inner / (y_norm2 + 1e-8) | |
| # print(cosxy) | |
| angle = math.acos(cosxy) | |
| # print(angle, math.degrees(angle)) | |
| # print('-------------') | |
| return math.degrees(angle) if y_right_hand[1] >= 0 else 360 - math.degrees(angle) | |
| def get_quadrant(angle): | |
| if angle[0] < angle[1]: | |
| if 0 <= angle[0] < 90 and 0 <= angle[1] < 90: | |
| quadrant = (angle[1] - angle[0], 0, 0, 0) | |
| elif 0 <= angle[0] < 90 and 90 <= angle[1] < 180: | |
| quadrant = (90 - angle[0], angle[1] - 90, 0, 0) | |
| elif 0 <= angle[0] < 90 and 180 <= angle[1] < 270: | |
| quadrant = (90 - angle[0], 90, angle[1] - 180, 0) | |
| elif 0 <= angle[0] < 90 and 270 <= angle[1] < 360: | |
| quadrant = (90 - angle[0], 90, 90, angle[1] - 270) | |
| elif 90 <= angle[0] < 180 and 90 <= angle[1] < 180: | |
| quadrant = (0, angle[1] - angle[0], 0, 0) | |
| elif 90 <= angle[0] < 180 and 180 <= angle[1] < 270: | |
| quadrant = (0, 180 - angle[0], angle[1] - 180, 0) | |
| elif 90 <= angle[0] < 180 and 270 <= angle[1] < 360: | |
| quadrant = (0, 180 - angle[0], 90, angle[1] - 270) | |
| elif 180 <= angle[0] < 270 and 180 <= angle[1] < 270: | |
| quadrant = (0, 0, angle[1] - angle[0], 0) | |
| elif 180 <= angle[0] < 270 and 270 <= angle[1] < 360: | |
| quadrant = (0, 0, 270 - angle[0], angle[1] - 270) | |
| elif 270 <= angle[0] < 360 and 270 <= angle[1] < 360: | |
| quadrant = (0, 0, 0, angle[1] - angle[0]) | |
| else: | |
| if 0 <= angle[1] < 90 and 0 <= angle[0] < 90: | |
| quadrant_ = (angle[0] - angle[1], 0, 0, 0) | |
| elif 0 <= angle[1] < 90 and 90 <= angle[0] < 180: | |
| quadrant_ = (90 - angle[1], angle[0] - 90, 0, 0) | |
| elif 0 <= angle[1] < 90 and 180 <= angle[0] < 270: | |
| quadrant_ = (90 - angle[1], 90, angle[0] - 180, 0) | |
| elif 0 <= angle[1] < 90 and 270 <= angle[0] < 360: | |
| quadrant_ = (90 - angle[1], 90, 90, angle[0] - 270) | |
| elif 90 <= angle[1] < 180 and 90 <= angle[0] < 180: | |
| quadrant_ = (0, angle[0] - angle[1], 0, 0) | |
| elif 90 <= angle[1] < 180 and 180 <= angle[0] < 270: | |
| quadrant_ = (0, 180 - angle[1], angle[0] - 180, 0) | |
| elif 90 <= angle[1] < 180 and 270 <= angle[0] < 360: | |
| quadrant_ = (0, 180 - angle[1], 90, angle[0] - 270) | |
| elif 180 <= angle[1] < 270 and 180 <= angle[0] < 270: | |
| quadrant_ = (0, 0, angle[0] - angle[1], 0) | |
| elif 180 <= angle[1] < 270 and 270 <= angle[0] < 360: | |
| quadrant_ = (0, 0, 270 - angle[1], angle[0] - 270) | |
| elif 270 <= angle[1] < 360 and 270 <= angle[0] < 360: | |
| quadrant_ = (0, 0, 0, angle[0] - angle[1]) | |
| quadrant = (90 - quadrant_[0], 90 - quadrant_[1], 90 - quadrant_[2], 90 - quadrant_[3]) | |
| return quadrant | |
| def find_which_angle_to_counterclockwise_rotate_from(t): | |
| if t > 270: | |
| return 630 - t | |
| else: | |
| return 270 - t | |
| def counter_degree(d): | |
| if d >= 180: | |
| return d - 180 | |
| else: | |
| return d + 180 | |
| def rotate_degree_clockwise_from_counter_degree(src_degree, dest_degree): | |
| delta = src_degree - dest_degree | |
| return delta if delta >= 0 else 360 + delta | |
| def rotate_degree_counterclockwise_from_counter_degree(src_degree, dest_degree): | |
| delta = dest_degree - src_degree | |
| return delta if delta >= 0 else 360 + delta | |
| def poly_area(points): | |
| s = 0 | |
| points_count = len(points) | |
| for i in range(points_count): | |
| point = points[i] | |
| point2 = points[(i + 1) % points_count] | |
| s += (point[0] - point2[0]) * (point[1] + point2[1]) | |
| return s / 2 | |