コード例 #1
0
def test_properties(segments: List[Segment]) -> None:
    result = segments_to_multisegment(segments)

    assert not segments_cross_or_overlap(result.segments)
    assert equivalence(not segments_cross_or_overlap(segments),
                       sorted(result.segments,
                              key=segment_to_endpoints)
                       == sorted(map(to_sorted_segment, segments),
                                 key=segment_to_endpoints))
コード例 #2
0
def test_step(context: Context, segments: List[Segment]) -> None:
    first_segment, *rest_segments = segments

    result = segments_cross_or_overlap(rest_segments)
    next_result = segments_cross_or_overlap(segments)

    assert (next_result is (result or any(
        context.segments_relation(first_segment, segment) in
        (Relation.COMPONENT, Relation.COMPOSITE, Relation.CROSS,
         Relation.EQUAL, Relation.OVERLAP) for segment in rest_segments)))
コード例 #3
0
def test_step(segments: List[Segment]) -> None:
    first_segment, *rest_segments = segments

    result = segments_cross_or_overlap(rest_segments)
    next_result = segments_cross_or_overlap(segments)

    assert (next_result is (result or any(
        segments_relationship(first_segment, segment) in
        (SegmentsRelationship.CROSS, SegmentsRelationship.OVERLAP)
        for segment in rest_segments)))
コード例 #4
0
ファイル: multisegment.py プロジェクト: lycantropos/gon
    def validate(self) -> None:
        """
        Checks if the multisegment is valid.

        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.validate()
        """
        segments = self.segments
        if len(segments) < MIN_MULTISEGMENT_SEGMENTS_COUNT:
            raise ValueError('Multisegment should have '
                             'at least {min_size} segments, '
                             'but found {size}.'
                             .format(min_size=MIN_MULTISEGMENT_SEGMENTS_COUNT,
                                     size=len(segments)))
        elif len(segments) > len(self._segments_set):
            raise ValueError('Duplicate segments found.')
        for segment in segments:
            segment.validate()
        if segments_cross_or_overlap(segments,
                                     context=self._context):
            raise ValueError('Crossing or overlapping segments found.')
コード例 #5
0
def is_non_shaped_valid(object_: Any) -> bool:
    points, segments = pack_non_shaped(object_)
    return (not any(segment_contains_point(segment, point)
                    for point in points
                    for segment in segments)
            and not segments_cross_or_overlap(segments,
                                              context=_context))
コード例 #6
0
def test_properties(segments: List[Segment]) -> None:
    result = segments_to_multisegment(segments)

    result_points, result_segments = pack_non_shaped(result)
    assert not result_points
    assert equivalence(
        not segments_cross_or_overlap(segments),
        are_segments_sequences_similar(result_segments, segments))
コード例 #7
0
ファイル: multipolygon.py プロジェクト: lycantropos/gon
    def validate(self) -> None:
        """
        Checks if the multipolygon is valid.

        Time complexity:
            ``O(vertices_count * log (vertices_count))``
        Memory complexity:
            ``O(vertices_count)``

        where
            
            .. code-block:: python

                vertices_count = sum(len(polygon.border.vertices)
                                     + sum(len(hole.vertices)
                                           for hole in polygon.holes)
                                     for polygon in self.polygons)

        >>> from gon.base import Contour, Multipolygon, Point, Polygon
        >>> multipolygon = Multipolygon(
        ...         [Polygon(Contour([Point(0, 0), Point(14, 0), Point(14, 14),
        ...                           Point(0, 14)]),
        ...                  [Contour([Point(2, 2), Point(2, 12),
        ...                            Point(12, 12), Point(12, 2)])]),
        ...          Polygon(Contour([Point(4, 4), Point(10, 4), Point(10, 10),
        ...                           Point(4, 10)]),
        ...                  [Contour([Point(6, 6), Point(6, 8), Point(8, 8),
        ...                            Point(8, 6)])])])
        >>> multipolygon.validate()
        """
        if len(self.polygons) < MIN_MULTIPOLYGON_POLYGONS_COUNT:
            raise ValueError('Multipolygon should have '
                             'at least {min_size} polygons, '
                             'but found {size}.'.format(
                                 min_size=MIN_MULTIPOLYGON_POLYGONS_COUNT,
                                 size=len(self.polygons)))
        elif len(self.polygons) > len(self._polygons_set):
            raise ValueError('Duplicate polygons found.')
        for polygon in self.polygons:
            polygon.validate()
        if segments_cross_or_overlap(list(
                flatten(polygon.edges for polygon in self.polygons)),
                                     context=self._context):
            raise ValueError('Polygons should only touch each other '
                             'in discrete number of points.')
コード例 #8
0
def are_segments_non_crossing_non_overlapping(segments: Sequence[Segment],
                                              context: Context) -> bool:
    return not segments_cross_or_overlap(segments, context=context)
コード例 #9
0
def test_degenerate_segments(segments: List[Segment]) -> None:
    with pytest.raises(ValueError):
        segments_cross_or_overlap(segments)
コード例 #10
0
def test_reversed_coordinates(segments: List[Segment]) -> None:
    result = segments_cross_or_overlap(segments)

    assert result is segments_cross_or_overlap(
        reverse_segments_coordinates(segments))
コード例 #11
0
def test_reversed_endpoints(segments: List[Segment]) -> None:
    result = segments_cross_or_overlap(segments)

    assert result is segments_cross_or_overlap(
        [reverse_segment(segment) for segment in segments])
コード例 #12
0
def test_reversed(segments: List[Segment]) -> None:
    result = segments_cross_or_overlap(segments)

    assert result is segments_cross_or_overlap(segments[::-1])
コード例 #13
0
def test_base_case(segments: List[Segment]) -> None:
    result = segments_cross_or_overlap(segments)

    assert not result
コード例 #14
0
def test_basic(segments: List[Segment]) -> None:
    result = segments_cross_or_overlap(segments)

    assert isinstance(result, bool)
コード例 #15
0
def is_multisegment_valid(multisegment: Multisegment) -> bool:
    return not segments_cross_or_overlap(multisegment.segments,
                                         context=_context)
コード例 #16
0
def segments_do_not_cross_or_overlap(segments: Sequence[Segment]) -> bool:
    return not segments_cross_or_overlap(segments)