def test_step(context: Context, segments: List[Segment]) -> None: *rest_segments, last_segment = segments result = segments_intersections(rest_segments) next_result = segments_intersections(segments) assert (next_result.keys() == ( result.keys() | {(index, len(segments) - 1) for index, segment in enumerate(rest_segments) if context. segments_relation(segment, last_segment) is not Relation.DISJOINT})) assert result.items() <= next_result.items() assert all(segment_id < next_segment_id == len(segments) - 1 for segment_id, next_segment_id in (next_result.keys() - result.keys())) assert all( context.segments_intersection( segments[segment_id], segments[next_segment_id]) == next_result[( segment_id, next_segment_id)][0] if len(next_result[( segment_id, next_segment_id)]) == 1 else context.segments_intersection( segments[segment_id], segments[next_segment_id]) not in (Relation.DISJOINT, Relation.TOUCH, Relation.CROSS) and ( to_sorted_pair(*next_result[(segment_id, next_segment_id)]) == next_result[(segment_id, next_segment_id)]) and all( context.segment_contains_point(segments[segment_id], point) for point in next_result[(segment_id, next_segment_id)]) and all( context.segment_contains_point(segments[next_segment_id], point) for point in next_result[(segment_id, next_segment_id)]) for segment_id, next_segment_id in (next_result.keys() - result.keys())) assert all( context.segments_relation(segments[segment_id], segments[next_segment_id]) is not Relation.DISJOINT for segment_id, next_segment_id in (next_result.keys() - result.keys()))
def locate_point(segment: Segment, point: Point, context: Context) -> Location: return (Location.BOUNDARY if context.segment_contains_point( segment, point) else Location.EXTERIOR)
def test_base_case(context: Context, contour: Contour) -> None: result = contour_self_intersects(contour) left_vertex, mid_vertex, right_vertex = sorted(contour.vertices) assert result is context.segment_contains_point( context.segment_cls(left_vertex, right_vertex), mid_vertex)