operations.py (2203B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\drawingpolygon\operations.py 2 3 4 def do_any_segments_intersect(vertices): 5 if len(vertices) <= 3: 6 return False 7 segments = _get_segments(vertices) 8 for index_1, segment_1 in enumerate(segments): 9 for index_2, segment_2 in enumerate(segments): 10 should_check_this_segment_pair = index_1 + 1 < index_2 and (index_1 != 0 or index_2 != len(segments) - 1) 11 if should_check_this_segment_pair and do_segments_intersect(segment_1, segment_2): 12 return True 13 14 return False 15 16 17 def do_polygons_intersect(vertices_1, vertices_2): 18 if len(vertices_1) <= 2 or len(vertices_2) <= 2: 19 return False 20 segments_1 = _get_segments(vertices_1) 21 segments_2 = _get_segments(vertices_2) 22 for segment_1 in segments_1: 23 for segment_2 in segments_2: 24 if do_segments_intersect(segment_1, segment_2): 25 return True 26 27 return False 28 29 30 def is_point_inside_polygon(x, y, vertices): 31 number_of_intersections = 0 32 polygon_segments = _get_segments(vertices) 33 for polygon_segment in polygon_segments: 34 test_segment = [[0, 0], [x, y]] 35 if do_segments_intersect(test_segment, polygon_segment): 36 number_of_intersections += 1 37 38 return bool(number_of_intersections % 2) 39 40 41 def _get_segments(vertices): 42 all_segments = [] 43 first_point = vertices[0] 44 for second_point in vertices[1:] + [vertices[0]]: 45 all_segments.append([first_point, second_point]) 46 first_point = second_point 47 48 return all_segments 49 50 51 def do_segments_intersect(segment_1, segment_2): 52 a, b = segment_1 53 c, d = segment_2 54 return _is_clockwise_oriented(a, c, d) != _is_clockwise_oriented(b, c, d) and _is_clockwise_oriented(a, b, c) != _is_clockwise_oriented(a, b, d) 55 56 57 def _is_clockwise_oriented(a, b, c): 58 return (c[1] - a[1]) * (b[0] - a[0]) < (b[1] - a[1]) * (c[0] - a[0]) 59 60 61 def are_points_within_distance(point_1, point_2, max_distance): 62 a = abs(point_1[0] - point_2[0]) 63 b = abs(point_1[1] - point_2[1]) 64 square_distance = a * a + b * b 65 return square_distance <= max_distance * max_distance