Welcome to hypothesis_geometry’s documentation!

Note

If object is not listed in documentation it should be considered as implementation detail that can change and should not be relied upon.

hypothesis_geometry.planar.points(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Point][source]

Returns a strategy for points.

Parameters
  • x_coordinates – strategy for points’ x-coordinates.

  • y_coordinates – strategy for points’ y-coordinates, None for reusing x-coordinates strategy.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Point = context.point_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> points = planar.points(coordinates)
>>> point = points.example()
>>> isinstance(point, Point)
True
>>> (isinstance(point.x, coordinates_type)
...  and isinstance(point.y, coordinates_type))
True
>>> (min_coordinate <= point.x <= max_coordinate
...  and min_coordinate <= point.y <= max_coordinate)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> points = planar.points(x_coordinates, y_coordinates)
>>> point = points.example()
>>> isinstance(point, Point)
True
>>> (isinstance(point.x, coordinates_type)
...  and isinstance(point.y, coordinates_type))
True
>>> (min_x_coordinate <= point.x <= max_x_coordinate
...  and min_y_coordinate <= point.y <= max_y_coordinate)
True
hypothesis_geometry.planar.multipoints(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = 0, max_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Multipoint][source]

Returns a strategy for multipoints.

Parameters
  • x_coordinates – strategy for points’ x-coordinates.

  • y_coordinates – strategy for points’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for multipoint size.

  • max_size – upper bound for multipoint size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Multipoint = context.multipoint_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> multipoints = planar.multipoints(coordinates,
...                                  min_size=min_size,
...                                  max_size=max_size)
>>> multipoint = multipoints.example()
>>> isinstance(multipoint, Multipoint)
True
>>> min_size <= len(multipoint.points) <= max_size
True
>>> all(isinstance(point.x, coordinates_type)
...     and isinstance(point.y, coordinates_type)
...     for point in multipoint.points)
True
>>> all(min_coordinate <= point.x <= max_coordinate
...     and min_coordinate <= point.y <= max_coordinate
...     for point in multipoint.points)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> multipoints = planar.multipoints(x_coordinates, y_coordinates,
...                                      min_size=min_size,
...                                      max_size=max_size)
>>> multipoint = multipoints.example()
>>> isinstance(multipoint, Multipoint)
True
>>> min_size <= len(multipoint.points) <= max_size
True
>>> all(isinstance(point.x, coordinates_type)
...     and isinstance(point.y, coordinates_type)
...     for point in multipoint.points)
True
>>> all(min_x_coordinate <= point.x <= max_x_coordinate
...     and min_y_coordinate <= point.y <= max_y_coordinate
...     for point in multipoint.points)
True
hypothesis_geometry.planar.segments(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Segment][source]

Returns a strategy for segments.

Parameters
  • x_coordinates – strategy for endpoints’ x-coordinates.

  • y_coordinates – strategy for endpoints’ y-coordinates, None for reusing x-coordinates strategy.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Segment = context.segment_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> segments = planar.segments(coordinates)
>>> segment = segments.example()
>>> isinstance(segment, Segment)
True
>>> (isinstance(segment.start.x, coordinates_type)
...  and isinstance(segment.start.y, coordinates_type)
...  and isinstance(segment.end.x, coordinates_type)
...  and isinstance(segment.end.y, coordinates_type))
True
>>> (min_coordinate <= segment.start.x <= max_coordinate
...  and min_coordinate <= segment.start.y <= max_coordinate
...  and min_coordinate <= segment.end.x <= max_coordinate
...  and min_coordinate <= segment.end.y <= max_coordinate)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> segments = planar.segments(x_coordinates, y_coordinates)
>>> segment = segments.example()
>>> isinstance(segment, Segment)
True
>>> (isinstance(segment.start.x, coordinates_type)
...  and isinstance(segment.start.y, coordinates_type)
...  and isinstance(segment.end.x, coordinates_type)
...  and isinstance(segment.end.y, coordinates_type))
True
>>> (min_x_coordinate <= segment.start.x <= max_x_coordinate
...  and min_y_coordinate <= segment.start.y <= max_y_coordinate
...  and min_x_coordinate <= segment.end.x <= max_x_coordinate
...  and min_y_coordinate <= segment.end.y <= max_y_coordinate)
True
hypothesis_geometry.planar.multisegments(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = 0, max_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Multisegment][source]

Returns a strategy for multisegments.

Parameters
  • x_coordinates – strategy for segments’ x-coordinates.

  • y_coordinates – strategy for segments’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for multisegment size.

  • max_size – upper bound for multisegment size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Multisegment = context.multisegment_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> multisegments = planar.multisegments(coordinates,
...                                      min_size=min_size,
...                                      max_size=max_size)
>>> multisegment = multisegments.example()
>>> isinstance(multisegment, Multisegment)
True
>>> min_size <= len(multisegment.segments) <= max_size
True
>>> all(isinstance(segment.start.x, coordinates_type)
...     and isinstance(segment.start.y, coordinates_type)
...     and isinstance(segment.start.x, coordinates_type)
...     and isinstance(segment.start.y, coordinates_type)
...     for segment in multisegment.segments)
True
>>> all(min_coordinate <= segment.start.x <= max_coordinate
...     and min_coordinate <= segment.start.y <= max_coordinate
...     and min_coordinate <= segment.end.x <= max_coordinate
...     and min_coordinate <= segment.end.y <= max_coordinate
...     for segment in multisegment.segments)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> multisegments = planar.multisegments(x_coordinates, y_coordinates,
...                                      min_size=min_size,
...                                      max_size=max_size)
>>> multisegment = multisegments.example()
>>> isinstance(multisegment, Multisegment)
True
>>> min_size <= len(multisegment.segments) <= max_size
True
>>> all(isinstance(segment.start.x, coordinates_type)
...     and isinstance(segment.start.y, coordinates_type)
...     and isinstance(segment.start.x, coordinates_type)
...     and isinstance(segment.start.y, coordinates_type)
...     for segment in multisegment.segments)
True
>>> all(min_x_coordinate <= segment.start.x <= max_x_coordinate
...     and min_y_coordinate <= segment.start.y <= max_y_coordinate
...     and min_x_coordinate <= segment.end.x <= max_x_coordinate
...     and min_y_coordinate <= segment.end.y <= max_y_coordinate
...     for segment in multisegment.segments)
True
hypothesis_geometry.planar.contours(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = <MinContourSize.CONVEX: 3>, max_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Contour][source]

Returns a strategy for contours.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for contour size.

  • max_size – upper bound for contour size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Contour = context.contour_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.contours(coordinates,
...                            min_size=min_size,
...                            max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for vertex in contour.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.contours(x_coordinates, y_coordinates,
...                            min_size=min_size,
...                            max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for vertex in contour.vertices)
True
hypothesis_geometry.planar.convex_contours(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = <MinContourSize.CONVEX: 3>, max_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Contour][source]

Returns a strategy for convex contours. Convex contour is a contour such that the line segment formed by any two points from contour’s line segments stays inside the region bounded by the contour.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for contour size.

  • max_size – upper bound for contour size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Contour = context.contour_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.convex_contours(coordinates,
...                                   min_size=min_size,
...                                   max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for vertex in contour.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.convex_contours(x_coordinates, y_coordinates,
...                                   min_size=min_size,
...                                   max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for vertex in contour.vertices)
True
hypothesis_geometry.planar.concave_contours(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = <MinContourSize.CONCAVE: 4>, max_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Contour][source]

Returns a strategy for concave contours. Concave contour is a contour that is not convex.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for contour size.

  • max_size – upper bound for contour size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Contour = context.contour_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.concave_contours(coordinates,
...                                    min_size=min_size,
...                                    max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for vertex in contour.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.concave_contours(x_coordinates, y_coordinates,
...                                    min_size=min_size,
...                                    max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for vertex in contour.vertices)
True
hypothesis_geometry.planar.triangular_contours(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Contour][source]

Returns a strategy for triangular contours. Triangular contour is a contour formed by 3 points.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Contour = context.contour_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> contours = planar.triangular_contours(coordinates)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> len(contour.vertices) == 3
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for vertex in contour.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> contours = planar.triangular_contours(x_coordinates, y_coordinates)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> len(contour.vertices) == 3
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for vertex in contour.vertices)
True
hypothesis_geometry.planar.rectangular_contours(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Contour][source]

Returns a strategy for axis-aligned rectangular contours. Rectangular contour is a contour formed by 4 points.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Contour = context.contour_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> contours = planar.rectangular_contours(coordinates)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> len(contour.vertices) == 4
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for vertex in contour.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> contours = planar.rectangular_contours(x_coordinates, y_coordinates)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> len(contour.vertices) == 4
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for vertex in contour.vertices)
True
hypothesis_geometry.planar.boxes(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Box][source]

Returns a strategy for boxes.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Box = context.box_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> boxes = planar.boxes(coordinates)
>>> box = boxes.example()
>>> isinstance(box, Box)
True
>>> (isinstance(box.min_x, coordinates_type)
...  and isinstance(box.max_x, coordinates_type)
...  and isinstance(box.min_y, coordinates_type)
...  and isinstance(box.max_y, coordinates_type))
True
>>> (min_coordinate <= box.min_x <= max_coordinate
...  and min_coordinate <= box.max_x <= max_coordinate
...  and min_coordinate <= box.min_y <= max_coordinate
...  and min_coordinate <= box.max_y <= max_coordinate)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> boxes = planar.boxes(x_coordinates, y_coordinates)
>>> box = boxes.example()
>>> isinstance(box, Box)
True
>>> (isinstance(box.min_x, coordinates_type)
...  and isinstance(box.max_x, coordinates_type)
...  and isinstance(box.min_y, coordinates_type)
...  and isinstance(box.max_y, coordinates_type))
True
>>> (min_x_coordinate <= box.min_x <= max_x_coordinate
...  and min_x_coordinate <= box.max_x <= max_x_coordinate)
True
>>> (min_y_coordinate <= box.min_y <= max_y_coordinate
...  and min_y_coordinate <= box.max_y <= max_y_coordinate)
True
hypothesis_geometry.planar.star_contours(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = <MinContourSize.CONVEX: 3>, max_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Contour][source]

Returns a strategy for star contours. Star contour is a contour such that every vertex is visible from centroid, i.e. segments from centroid to vertices do not cross or overlap contour.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for contour size.

  • max_size – upper bound for contour size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Contour = context.contour_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.star_contours(coordinates,
...                                 min_size=min_size,
...                                 max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for vertex in contour.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> contours = planar.star_contours(x_coordinates, y_coordinates,
...                                 min_size=min_size,
...                                 max_size=max_size)
>>> contour = contours.example()
>>> isinstance(contour, Contour)
True
>>> min_size <= len(contour.vertices) <= max_size
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in contour.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for vertex in contour.vertices)
True
hypothesis_geometry.planar.multicontours(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = 0, max_size: Optional[int] = None, min_contour_size: int = <MinContourSize.CONVEX: 3>, max_contour_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[Sequence[ground.hints.Contour]][source]

Returns a strategy for multicontours. Multicontour is a possibly empty sequence of non-crossing and non-overlapping contours.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for size.

  • max_size – upper bound for size, None for unbound.

  • min_contour_size – lower bound for contour size.

  • max_contour_size – upper bound for contour size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Contour = context.contour_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> min_contour_size, max_contour_size = 3, 5
>>> multicontours = planar.multicontours(coordinates,
...                                      min_size=min_size,
...                                      max_size=max_size,
...                                      min_contour_size=min_contour_size,
...                                      max_contour_size=max_contour_size)
>>> multicontour = multicontours.example()
>>> isinstance(multicontour, list)
True
>>> all(isinstance(contour, Contour) for contour in multicontour)
True
>>> min_size <= len(multicontour) <= max_size
True
>>> all(min_contour_size <= len(contour.vertices) <= max_contour_size
...     for contour in multicontour)
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for contour in multicontour
...     for vertex in contour.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for contour in multicontour
...     for vertex in contour.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> min_contour_size, max_contour_size = 3, 5
>>> multicontours = planar.multicontours(x_coordinates, y_coordinates,
...                                      min_size=min_size,
...                                      max_size=max_size,
...                                      min_contour_size=min_contour_size,
...                                      max_contour_size=max_contour_size)
>>> multicontour = multicontours.example()
>>> isinstance(multicontour, list)
True
>>> all(isinstance(contour, Contour) for contour in multicontour)
True
>>> min_size <= len(multicontour) <= max_size
True
>>> all(min_contour_size <= len(contour.vertices) <= max_contour_size
...     for contour in multicontour)
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for contour in multicontour
...     for vertex in contour.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for contour in multicontour
...     for vertex in contour.vertices)
True
hypothesis_geometry.planar.polygons(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = <MinContourSize.CONVEX: 3>, max_size: Optional[int] = None, min_holes_size: int = 0, max_holes_size: Optional[int] = None, min_hole_size: int = <MinContourSize.CONVEX: 3>, max_hole_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Polygon][source]

Returns a strategy for polygons.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for border size.

  • max_size – upper bound for border size, None for unbound.

  • min_holes_size – lower bound for holes count.

  • max_holes_size – upper bound for holes count, None for countless.

  • min_hole_size – lower bound for hole size.

  • max_hole_size – upper bound for hole size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Polygon = context.polygon_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 5, 10
>>> min_holes_size, max_holes_size = 1, 4
>>> min_hole_size, max_hole_size = 3, 5
>>> polygons = planar.polygons(coordinates,
...                            min_size=min_size,
...                            max_size=max_size,
...                            min_holes_size=min_holes_size,
...                            max_holes_size=max_holes_size,
...                            min_hole_size=min_hole_size,
...                            max_hole_size=max_hole_size)
>>> polygon = polygons.example()
>>> isinstance(polygon, Polygon)
True
>>> min_size <= len(polygon.border.vertices) <= max_size
True
>>> min_holes_size <= len(polygon.holes) <= max_holes_size
True
>>> all(min_hole_size <= len(hole.vertices) <= max_hole_size
...     for hole in polygon.holes)
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in polygon.border.vertices)
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for hole in polygon.holes
...     for vertex in hole.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for vertex in polygon.border.vertices)
True
>>> all(min_coordinate <= vertex.x <= max_coordinate
...     and min_coordinate <= vertex.y <= max_coordinate
...     for hole in polygon.holes
...     for vertex in hole.vertices)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 5, 10
>>> min_holes_size, max_holes_size = 1, 4
>>> min_hole_size, max_hole_size = 3, 5
>>> polygons = planar.polygons(x_coordinates, y_coordinates,
...                            min_size=min_size,
...                            max_size=max_size,
...                            min_holes_size=min_holes_size,
...                            max_holes_size=max_holes_size,
...                            min_hole_size=min_hole_size,
...                            max_hole_size=max_hole_size)
>>> polygon = polygons.example()
>>> isinstance(polygon, Polygon)
True
>>> min_size <= len(polygon.border.vertices) <= max_size
True
>>> min_holes_size <= len(polygon.holes) <= max_holes_size
True
>>> all(min_hole_size <= len(hole.vertices) <= max_hole_size
...     for hole in polygon.holes)
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for vertex in polygon.border.vertices)
True
>>> all(isinstance(vertex.x, coordinates_type)
...     and isinstance(vertex.y, coordinates_type)
...     for hole in polygon.holes
...     for vertex in hole.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for vertex in polygon.border.vertices)
True
>>> all(min_x_coordinate <= vertex.x <= max_x_coordinate
...     and min_y_coordinate <= vertex.y <= max_y_coordinate
...     for hole in polygon.holes
...     for vertex in hole.vertices)
True
hypothesis_geometry.planar.multipolygons(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_size: int = 0, max_size: Optional[int] = None, min_border_size: int = <MinContourSize.CONVEX: 3>, max_border_size: Optional[int] = None, min_holes_size: int = 0, max_holes_size: Optional[int] = None, min_hole_size: int = <MinContourSize.CONVEX: 3>, max_hole_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[ground.hints.Multipolygon][source]

Returns a strategy for multipolygons.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_size – lower bound for size.

  • max_size – upper bound for size, None for unbound.

  • min_border_size – lower bound for polygons’ border size.

  • max_border_size – upper bound for polygons’ border size, None for unbound.

  • min_holes_size – lower bound for polygons’ holes count.

  • max_holes_size – upper bound for polygons’ holes count, None for countless.

  • min_hole_size – lower bound for hole size.

  • max_hole_size – upper bound for polygons’ hole size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Multipolygon = context.multipolygon_cls

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_size, max_size = 0, 5
>>> min_border_size, max_border_size = 5, 10
>>> min_holes_size, max_holes_size = 1, 4
>>> min_hole_size, max_hole_size = 3, 5
>>> multipolygons = planar.multipolygons(coordinates,
...                                      min_size=min_size,
...                                      max_size=max_size,
...                                      min_border_size=min_border_size,
...                                      max_border_size=max_border_size,
...                                      min_holes_size=min_holes_size,
...                                      max_holes_size=max_holes_size,
...                                      min_hole_size=min_hole_size,
...                                      max_hole_size=max_hole_size)
>>> multipolygon = multipolygons.example()
>>> isinstance(multipolygon, Multipolygon)
True
>>> min_size <= len(multipolygon.polygons) <= max_size
True
>>> all(min_border_size <= len(polygon.border.vertices) <= max_border_size
...     and min_holes_size <= len(polygon.holes) <= max_holes_size
...     and all(min_hole_size <= len(hole.vertices) <= max_hole_size
...             for hole in polygon.holes)
...     for polygon in multipolygon.polygons)
True
>>> all(all(isinstance(vertex.x, coordinates_type)
...         and isinstance(vertex.y, coordinates_type)
...         for vertex in polygon.border.vertices)
...     and all(isinstance(vertex.x, coordinates_type)
...             and isinstance(vertex.y, coordinates_type)
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True
>>> all(all(min_coordinate <= vertex.x <= max_coordinate
...         and min_coordinate <= vertex.y <= max_coordinate
...         for vertex in polygon.border.vertices)
...     and all(min_coordinate <= vertex.x <= max_coordinate
...             and min_coordinate <= vertex.y <= max_coordinate
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_size, max_size = 0, 5
>>> min_border_size, max_border_size = 5, 10
>>> min_holes_size, max_holes_size = 1, 4
>>> min_hole_size, max_hole_size = 3, 5
>>> multipolygons = planar.multipolygons(x_coordinates, y_coordinates,
...                                      min_size=min_size,
...                                      max_size=max_size,
...                                      min_border_size=min_border_size,
...                                      max_border_size=max_border_size,
...                                      min_holes_size=min_holes_size,
...                                      max_holes_size=max_holes_size,
...                                      min_hole_size=min_hole_size,
...                                      max_hole_size=max_hole_size)
>>> multipolygon = multipolygons.example()
>>> isinstance(multipolygon, Multipolygon)
True
>>> min_size <= len(multipolygon.polygons) <= max_size
True
>>> all(min_border_size <= len(polygon.border.vertices) <= max_border_size
...     and min_holes_size <= len(polygon.holes) <= max_holes_size
...     and all(min_hole_size <= len(hole.vertices) <= max_hole_size
...             for hole in polygon.holes)
...     for polygon in multipolygon.polygons)
True
>>> all(all(isinstance(vertex.x, coordinates_type)
...         and isinstance(vertex.y, coordinates_type)
...         for vertex in polygon.border.vertices)
...     and all(isinstance(vertex.x, coordinates_type)
...             and isinstance(vertex.y, coordinates_type)
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True
>>> all(all(min_x_coordinate <= vertex.x <= max_x_coordinate
...         and min_y_coordinate <= vertex.y <= max_y_coordinate
...         for vertex in polygon.border.vertices)
...     and all(min_x_coordinate <= vertex.x <= max_x_coordinate
...             and min_y_coordinate <= vertex.y <= max_y_coordinate
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True
hypothesis_geometry.planar.mixes(x_coordinates: hypothesis.strategies.SearchStrategy[Coordinate], y_coordinates: Optional[hypothesis.strategies.SearchStrategy[Coordinate]] = None, *, min_multipoint_size: int = 0, max_multipoint_size: Optional[int] = None, min_multisegment_size: int = 0, max_multisegment_size: Optional[int] = None, min_multipolygon_size: int = 0, max_multipolygon_size: Optional[int] = None, min_multipolygon_border_size: int = <MinContourSize.CONVEX: 3>, max_multipolygon_border_size: Optional[int] = None, min_multipolygon_holes_size: int = 0, max_multipolygon_holes_size: Optional[int] = None, min_multipolygon_hole_size: int = <MinContourSize.CONVEX: 3>, max_multipolygon_hole_size: Optional[int] = None) → hypothesis.strategies.SearchStrategy[Tuple[ground.hints.Multipoint, ground.hints.Multisegment, ground.hints.Multipolygon]][source]

Returns a strategy for mixes. Mix is a triplet of disjoint multipoint, multisegment and multipolygon.

Parameters
  • x_coordinates – strategy for vertices’ x-coordinates.

  • y_coordinates – strategy for vertices’ y-coordinates, None for reusing x-coordinates strategy.

  • min_multipoint_size – lower bound for multipoint size.

  • max_multipoint_size – upper bound for multipoint size, None for unbound.

  • min_multisegment_size – lower bound for multisegment size.

  • max_multisegment_size – upper bound for multisegment size, None for unbound.

  • min_multipolygon_size – lower bound for multipolygon size.

  • max_multipolygon_size – upper bound for multipolygon size, None for unbound.

  • min_multipolygon_border_size – lower bound for polygons’ border size.

  • max_multipolygon_border_size – upper bound for polygons’ border size, None for unbound.

  • min_multipolygon_holes_size – lower bound for polygons’ holes count.

  • max_multipolygon_holes_size – upper bound for polygons’ holes count, None for countless.

  • min_multipolygon_hole_size – lower bound for hole size.

  • max_multipolygon_hole_size – upper bound for polygons’ hole size, None for unbound.

>>> from ground.base import get_context
>>> from hypothesis import strategies
>>> from hypothesis_geometry import planar
>>> context = get_context()
>>> Multipoint, Multipolygon, Multisegment = (context.multipoint_cls,
...                                           context.multipolygon_cls,
...                                           context.multisegment_cls)

For same coordinates’ domain:

>>> min_coordinate, max_coordinate = -1., 1.
>>> coordinates_type = float
>>> coordinates = strategies.floats(min_coordinate, max_coordinate,
...                                 allow_infinity=False,
...                                 allow_nan=False)
>>> min_multipoint_size, max_multipoint_size = 2, 3
>>> min_multisegment_size, max_multisegment_size = 1, 4
>>> min_multipolygon_size, max_multipolygon_size = 0, 5
>>> min_multipolygon_border_size, max_multipolygon_border_size = 5, 10
>>> min_multipolygon_holes_size, max_multipolygon_holes_size = 1, 4
>>> min_multipolygon_hole_size, max_multipolygon_hole_size = 3, 5
>>> mixes = planar.mixes(
...         coordinates,
...         min_multipoint_size=min_multipoint_size,
...         max_multipoint_size=max_multipoint_size,
...         min_multisegment_size=min_multisegment_size,
...         max_multisegment_size=max_multisegment_size,
...         min_multipolygon_size=min_multipolygon_size,
...         max_multipolygon_size=max_multipolygon_size,
...         min_multipolygon_border_size=min_multipolygon_border_size,
...         max_multipolygon_border_size=max_multipolygon_border_size,
...         min_multipolygon_holes_size=min_multipolygon_holes_size,
...         max_multipolygon_holes_size=max_multipolygon_holes_size,
...         min_multipolygon_hole_size=min_multipolygon_hole_size,
...         max_multipolygon_hole_size=max_multipolygon_hole_size)
>>> mix = mixes.example()
>>> isinstance(mix, tuple)
True
>>> len(mix) == 3
True
>>> multipoint, multisegment, multipolygon = mix
>>> isinstance(multipoint, Multipoint)
True
>>> min_multipoint_size <= len(multipoint.points) <= max_multipoint_size
True
>>> all(isinstance(point.x, coordinates_type)
...     and isinstance(point.y, coordinates_type)
...     for point in multipoint.points)
True
>>> all(min_coordinate <= point.x <= max_coordinate
...     and min_coordinate <= point.y <= max_coordinate
...     for point in multipoint.points)
True
>>> isinstance(multisegment, Multisegment)
True
>>> (min_multisegment_size <= len(multisegment.segments)
...  <= max_multisegment_size)
True
>>> all(isinstance(segment.start.x, coordinates_type)
...     and isinstance(segment.start.y, coordinates_type)
...     and isinstance(segment.end.x, coordinates_type)
...     and isinstance(segment.end.y, coordinates_type)
...     for segment in multisegment.segments)
True
>>> all(min_coordinate <= segment.start.x <= max_coordinate
...     and min_coordinate <= segment.start.y <= max_coordinate
...     and min_coordinate <= segment.end.x <= max_coordinate
...     and min_coordinate <= segment.end.y <= max_coordinate
...     for segment in multisegment.segments)
True
>>> isinstance(multipolygon, Multipolygon)
True
>>> (min_multipolygon_size <= len(multipolygon.polygons)
...  <= max_multipolygon_size)
True
>>> all(min_multipolygon_border_size
...     <= len(polygon.border.vertices)
...     <= max_multipolygon_border_size
...     and (min_multipolygon_holes_size
...          <= len(polygon.holes)
...          <= max_multipolygon_holes_size)
...     and all(min_multipolygon_hole_size
...             <= len(hole.vertices)
...             <= max_multipolygon_hole_size
...             for hole in polygon.holes)
...     for polygon in multipolygon.polygons)
True
>>> all(all(isinstance(vertex.x, coordinates_type)
...         and isinstance(vertex.y, coordinates_type)
...         for vertex in polygon.border.vertices)
...     and all(isinstance(vertex.x, coordinates_type)
...             and isinstance(vertex.y, coordinates_type)
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True
>>> all(all(min_coordinate <= vertex.x <= max_coordinate
...         and min_coordinate <= vertex.y <= max_coordinate
...         for vertex in polygon.border.vertices)
...     and all(min_coordinate <= vertex.x <= max_coordinate
...             and min_coordinate <= vertex.y <= max_coordinate
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True

For different coordinates’ domains:

>>> min_x_coordinate, max_x_coordinate = -1., 1.
>>> min_y_coordinate, max_y_coordinate = 10., 100.
>>> coordinates_type = float
>>> x_coordinates = strategies.floats(min_x_coordinate, max_x_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> y_coordinates = strategies.floats(min_y_coordinate, max_y_coordinate,
...                                   allow_infinity=False,
...                                   allow_nan=False)
>>> min_multipoint_size, max_multipoint_size = 2, 3
>>> min_multisegment_size, max_multisegment_size = 1, 4
>>> min_multipolygon_size, max_multipolygon_size = 0, 5
>>> min_multipolygon_border_size, max_multipolygon_border_size = 5, 10
>>> min_multipolygon_holes_size, max_multipolygon_holes_size = 1, 4
>>> min_multipolygon_hole_size, max_multipolygon_hole_size = 3, 5
>>> mixes = planar.mixes(
...         x_coordinates, y_coordinates,
...         min_multipoint_size=min_multipoint_size,
...         max_multipoint_size=max_multipoint_size,
...         min_multisegment_size=min_multisegment_size,
...         max_multisegment_size=max_multisegment_size,
...         min_multipolygon_size=min_multipolygon_size,
...         max_multipolygon_size=max_multipolygon_size,
...         min_multipolygon_border_size=min_multipolygon_border_size,
...         max_multipolygon_border_size=max_multipolygon_border_size,
...         min_multipolygon_holes_size=min_multipolygon_holes_size,
...         max_multipolygon_holes_size=max_multipolygon_holes_size,
...         min_multipolygon_hole_size=min_multipolygon_hole_size,
...         max_multipolygon_hole_size=max_multipolygon_hole_size)
>>> mix = mixes.example()
>>> isinstance(mix, tuple)
True
>>> len(mix) == 3
True
>>> multipoint, multisegment, multipolygon = mix
>>> isinstance(multipoint, Multipoint)
True
>>> min_multipoint_size <= len(multipoint.points) <= max_multipoint_size
True
>>> all(isinstance(point.x, coordinates_type)
...     and isinstance(point.y, coordinates_type)
...     for point in multipoint.points)
True
>>> all(min_x_coordinate <= point.x <= max_x_coordinate
...     and min_y_coordinate <= point.y <= max_y_coordinate
...     for point in multipoint.points)
True
>>> isinstance(multisegment, Multisegment)
True
>>> (min_multisegment_size <= len(multisegment.segments)
...  <= max_multisegment_size)
True
>>> all(isinstance(segment.start.x, coordinates_type)
...     and isinstance(segment.start.y, coordinates_type)
...     and isinstance(segment.end.x, coordinates_type)
...     and isinstance(segment.end.y, coordinates_type)
...     for segment in multisegment.segments)
True
>>> all(min_x_coordinate <= segment.start.x <= max_x_coordinate
...     and min_y_coordinate <= segment.start.y <= max_y_coordinate
...     and min_x_coordinate <= segment.end.x <= max_x_coordinate
...     and min_y_coordinate <= segment.end.y <= max_y_coordinate
...     for segment in multisegment.segments)
True
>>> isinstance(multipolygon, Multipolygon)
True
>>> (min_multipolygon_size <= len(multipolygon.polygons)
...  <= max_multipolygon_size)
True
>>> all(min_multipolygon_border_size
...     <= len(polygon.border.vertices)
...     <= max_multipolygon_border_size
...     and (min_multipolygon_holes_size
...          <= len(polygon.holes)
...          <= max_multipolygon_holes_size)
...     and all(min_multipolygon_hole_size
...             <= len(hole.vertices)
...             <= max_multipolygon_hole_size
...             for hole in polygon.holes)
...     for polygon in multipolygon.polygons)
True
>>> all(all(isinstance(vertex.x, coordinates_type)
...         and isinstance(vertex.y, coordinates_type)
...         for vertex in polygon.border.vertices)
...     and all(isinstance(vertex.x, coordinates_type)
...             and isinstance(vertex.y, coordinates_type)
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True
>>> all(all(min_x_coordinate <= vertex.x <= max_x_coordinate
...         and min_y_coordinate <= vertex.y <= max_y_coordinate
...         for vertex in polygon.border.vertices)
...     and all(min_x_coordinate <= vertex.x <= max_x_coordinate
...             and min_y_coordinate <= vertex.y <= max_y_coordinate
...             for hole in polygon.holes
...             for vertex in hole.vertices)
...     for polygon in multipolygon.polygons)
True