NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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