def test_associativity(multisegments_triplet: MultisegmentsTriplet) -> None: first, second, third = multisegments_triplet result = unite_multisegments(unite_multisegments(first, second), third) assert are_compounds_similar( result, unite_multisegments(first, unite_multisegments(second, third)))
def test_distribution_over_intersection( multisegments_triplet: MultisegmentsTriplet) -> None: first, second, third = multisegments_triplet second_third_intersection = intersect_multisegments(second, third) assert (not is_multisegment(second_third_intersection) or are_multisegments_equivalent( unite_multisegments(first, second_third_intersection), intersect_multisegments(unite_multisegments(first, second), unite_multisegments(first, third))))
def test_reversals(multisegments_pair: MultisegmentsPair) -> None: first, second = multisegments_pair result = unite_multisegments(first, second) assert are_compounds_similar( result, unite_multisegments(first, reverse_multisegment(second))) assert are_compounds_similar( result, reverse_multisegment_coordinates( unite_multisegments(reverse_multisegment_coordinates(first), reverse_multisegment_coordinates(second))))
def test_difference_operand( multisegments_triplet: MultisegmentsTriplet) -> None: first, second, third = multisegments_triplet first_second_difference = subtract_multisegments(first, second) second_third_difference = subtract_multisegments(second, third) assert (not is_multisegment(first_second_difference) or not is_multisegment(second_third_difference) or are_multisegments_equivalent( unite_multisegments(first_second_difference, third), subtract_multisegments(unite_multisegments(first, third), second_third_difference)))
def test_equivalents(multisegments_pair: MultisegmentsPair) -> None: left_multisegment, right_multisegment = multisegments_pair result = symmetric_subtract_multisegments(left_multisegment, right_multisegment) assert result == subtract_multisegments( unite_multisegments(left_multisegment, right_multisegment), intersect_multisegments(right_multisegment, left_multisegment)) assert result == unite_multisegments( subtract_multisegments(left_multisegment, right_multisegment), subtract_multisegments(right_multisegment, left_multisegment))
def test_associativity(multisegments_triplet: MultisegmentsTriplet) -> None: (left_multisegment, mid_multisegment, right_multisegment) = multisegments_triplet result = unite_multisegments( unite_multisegments(left_multisegment, mid_multisegment), right_multisegment) assert are_multisegments_similar( result, unite_multisegments( left_multisegment, unite_multisegments(mid_multisegment, right_multisegment)))
def test_reversals(multisegments_pair: MultisegmentsPair) -> None: left_multisegment, right_multisegment = multisegments_pair result = unite_multisegments(left_multisegment, right_multisegment) assert are_multisegments_similar( result, unite_multisegments(reverse_multisegment(left_multisegment), right_multisegment)) assert are_multisegments_similar( result, unite_multisegments(left_multisegment, reverse_multisegment(right_multisegment)))
def test_difference_operand( multisegments_triplet: MultisegmentsTriplet) -> None: (left_multisegment, mid_multisegment, right_multisegment) = multisegments_triplet result = unite_multisegments( subtract_multisegments(left_multisegment, mid_multisegment), right_multisegment) assert are_multisegments_equivalent( result, subtract_multisegments( unite_multisegments(left_multisegment, right_multisegment), subtract_multisegments(mid_multisegment, right_multisegment)))
def test_distribution_over_intersection( multisegments_triplet: MultisegmentsTriplet) -> None: (left_multisegment, mid_multisegment, right_multisegment) = multisegments_triplet result = unite_multisegments( left_multisegment, intersect_multisegments(mid_multisegment, right_multisegment)) assert are_multisegments_equivalent( result, intersect_multisegments( unite_multisegments(left_multisegment, mid_multisegment), unite_multisegments(left_multisegment, right_multisegment)))
def test_equivalents(multisegments_pair: MultisegmentsPair) -> None: first, second = multisegments_pair result = symmetric_subtract_multisegments(first, second) first_second_difference = subtract_multisegments(first, second) second_first_difference = subtract_multisegments(second, first) second_first_intersection = intersect_multisegments(second, first) assert (not is_multisegment(second_first_intersection) or result == subtract_multisegments( unite_multisegments(first, second), second_first_intersection)) assert (not is_multisegment(first_second_difference) or not is_multisegment(second_first_difference) or result == unite_multisegments(first_second_difference, second_first_difference))
def __or__(self, other: Compound[Coordinate]) -> Compound[Coordinate]: """ Returns union of the contour with the other geometry. Time complexity: ``O(vertices_count * log vertices_count)`` Memory complexity: ``O(vertices_count)`` where ``vertices_count = len(self.vertices)``. >>> from gon.base import Contour, Multisegment, Point, Segment >>> contour = Contour([Point(0, 0), Point(1, 0), Point(0, 1)]) >>> (contour | contour ... == Multisegment([Segment(Point(0, 0), Point(1, 0)), ... Segment(Point(1, 0), Point(0, 1)), ... Segment(Point(0, 1), Point(0, 0))])) True """ return (self._unite_with_multipoint(other) if isinstance( other, Multipoint) else (unite_segment_with_multisegment( other, self, context=self._context) if isinstance( other, Segment) else (unite_multisegments(self, other, context=self._context) if isinstance(other, Linear) else NotImplemented)))
def test_right_neutral_element( empty_multisegment_with_multisegment: MultisegmentsPair) -> None: empty_multisegment, multisegment = empty_multisegment_with_multisegment result = unite_multisegments(multisegment, empty_multisegment) assert are_multisegments_similar(result, multisegment)
def __or__(self, other: Compound[Coordinate]) -> Compound[Coordinate]: """ Returns union of the multisegment with the other geometry. Time complexity: ``O(segments_count * log segments_count)`` Memory complexity: ``O(segments_count)`` where ``segments_count = len(self.segments)``. >>> from gon.base import Multisegment, Point, Segment >>> multisegment = Multisegment([Segment(Point(0, 0), Point(1, 0)), ... Segment(Point(0, 1), Point(1, 1))]) >>> multisegment | multisegment == multisegment True """ return (self._unite_with_multipoint(other) if isinstance(other, Multipoint) else (unite_segment_with_multisegment(other, self, context=self._context) if isinstance(other, Segment) else (unite_multisegments(self, other, context=self._context) if isinstance(other, Multisegment) else NotImplemented)))
def test_absorption_identity(multisegments_pair: MultisegmentsPair) -> None: first, second = multisegments_pair first_second_intersection = intersect_multisegments(first, second) assert (not is_multisegment(first_second_intersection) or are_multisegments_equivalent( unite_multisegments(first, first_second_intersection), first))
def test_absorption_identity(multisegments_pair: MultisegmentsPair) -> None: first, second = multisegments_pair assert are_multisegments_equivalent( complete_intersect_multisegments(first, unite_multisegments(first, second)), first)
def test_absorption_identity(multisegments_pair: MultisegmentsPair) -> None: left_multisegment, right_multisegment = multisegments_pair result = unite_multisegments( left_multisegment, intersect_multisegments(left_multisegment, right_multisegment)) assert are_multisegments_equivalent(result, left_multisegment)
def test_absorption_identity(multisegments_pair: MultisegmentsPair) -> None: left_multisegment, right_multisegment = multisegments_pair result = complete_intersect_multisegments( left_multisegment, unite_multisegments(left_multisegment, right_multisegment)) assert linear_mix_equivalent_to_multisegment(result, left_multisegment)
def test_union_subtrahend(multisegments_triplet: MultisegmentsTriplet) -> None: first, second, third = multisegments_triplet first_second_difference = subtract_multisegments(first, second) first_third_difference = subtract_multisegments(first, third) assert (not is_multisegment(first_second_difference) or not is_multisegment(first_third_difference) or are_compounds_similar( subtract_multisegments(first, unite_multisegments( second, third)), intersect_multisegments(first_second_difference, first_third_difference)))
def test_union_subtrahend(multisegments_triplet: MultisegmentsTriplet) -> None: (left_multisegment, mid_multisegment, right_multisegment) = multisegments_triplet result = subtract_multisegments( left_multisegment, unite_multisegments(mid_multisegment, right_multisegment)) assert are_multisegments_similar( result, intersect_multisegments( subtract_multisegments(left_multisegment, mid_multisegment), subtract_multisegments(left_multisegment, right_multisegment)))
def test_difference_subtrahend( multisegments_triplet: MultisegmentsTriplet) -> None: (left_multisegment, mid_multisegment, right_multisegment) = multisegments_triplet result = subtract_multisegments( left_multisegment, subtract_multisegments(mid_multisegment, right_multisegment)) assert are_multisegments_equivalent( result, unite_multisegments( subtract_multisegments(left_multisegment, mid_multisegment), intersect_multisegments(left_multisegment, right_multisegment)))
def test_intersection_subtrahend( multisegments_triplet: MultisegmentsTriplet) -> None: first, second, third = multisegments_triplet first_second_difference = subtract_multisegments(first, second) first_third_difference = subtract_multisegments(first, third) second_third_intersection = intersect_multisegments(second, third) assert (not is_multisegment(first_second_difference) or not is_multisegment(first_third_difference) or not is_multisegment(second_third_intersection) or are_multisegments_equivalent( subtract_multisegments(first, second_third_intersection), unite_multisegments(first_second_difference, first_third_difference)))
def test_basic(multisegments_pair: MultisegmentsPair) -> None: left_multisegment, right_multisegment = multisegments_pair result = unite_multisegments(left_multisegment, right_multisegment) assert is_multisegment(result)
def test_commutativity(multisegments_pair: MultisegmentsPair) -> None: left_multisegment, right_multisegment = multisegments_pair result = unite_multisegments(left_multisegment, right_multisegment) assert result == unite_multisegments(right_multisegment, left_multisegment)
def test_basic(multisegments_pair: MultisegmentsPair) -> None: first, second = multisegments_pair result = unite_multisegments(first, second) assert is_multisegment(result)
def test_commutativity(multisegments_pair: MultisegmentsPair) -> None: first, second = multisegments_pair result = unite_multisegments(first, second) assert result == unite_multisegments(second, first)
def test_validity(multisegments_pair: MultisegmentsPair) -> None: first, second = multisegments_pair result = unite_multisegments(first, second) assert is_multisegment_valid(result)
def test_idempotence(multisegment: Multisegment) -> None: result = unite_multisegments(multisegment, multisegment) assert are_multisegments_equivalent(result, multisegment)