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)))
Exemple #5
0
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))
Exemple #6
0
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)))
Exemple #7
0
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)))
Exemple #8
0
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)))
Exemple #9
0
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))
Exemple #11
0
    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)))
Exemple #12
0
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)
Exemple #13
0
    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))
Exemple #15
0
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)
Exemple #16
0
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)
Exemple #17
0
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)))
Exemple #19
0
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)))
Exemple #20
0
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)))
Exemple #22
0
def test_basic(multisegments_pair: MultisegmentsPair) -> None:
    left_multisegment, right_multisegment = multisegments_pair

    result = unite_multisegments(left_multisegment, right_multisegment)

    assert is_multisegment(result)
Exemple #23
0
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)