Source code for stardust.components.annotations.polygon

from typing import List, Union, Sequence
import numpy as np
from shapely.geometry import Polygon as SPolygon
from .point import Point
from .base_annotation import AnnotationType, AnnotationObject
from .line import Line
from .box import Box2D


[docs] class Polygon(Line, AnnotationObject, SPolygon): def __init__(self, points: Union[List[Point], np.ndarray, Sequence], **kwargs) -> None: """ This class defines the concept of 2d geometry Polygon Args: points: A list composed of Point objects or a Sequence composed of numbers Returns: Polygon instance Examples: .. code-block:: python polygon = Polygon([(0,0), (1,1), (2,2), (3,3)]) """ if not len(points) > 2: raise ValueError("Invalid number length of points") if isinstance(points[0], Point): self.shapely_polygon = SPolygon([[point.x, point.y] for point in points]) else: assert np.array(points).shape[1] == 2 self.shapely_polygon = SPolygon([[point[0], point[1]] for point in points]) Line.__init__(self, points=points) AnnotationObject.__init__(self, **kwargs) @property def area(self) -> float: """ Returns: float the area of current polygon instance """ return self.shapely_polygon.area @property def points_num(self) -> float: """ Returns: float the points num of current polygon instance """ return len(self.points) @property def bounding_box(self): """ Returns: float box2d obj, the box3d outer the current polygon """ bounds = self.shapely_polygon.bounds return Box2D(np.array([bounds[0], bounds[1]]), np.array([bounds[2], bounds[3]]))
[docs] @staticmethod def gen_polygon(slot, children_lst, parent_id, label_kind): """ generate the Polygon obj Args: slot: rosetta slot children_lst: rosetta children parent_id: Upper floor ID Returns: a Polygon instance """ children_lst = children_lst if children_lst else {} parent_id = parent_id if parent_id else "" label_kind = label_kind if label_kind else "" polygon = Polygon( points=np.asarray([[round(vertice['x'], 2), round(vertice['y'], 2)] for vertice in slot['vertices']]), parent=parent_id, id=slot['id'], label=label_kind, children=children_lst ) return polygon