2021-08-27 00:24:55 +08:00

138 lines
3.7 KiB
Python

from org.meteoinfo.geometry.graphic import Graphic
from org.meteoinfo.geometry.shape import ShapeUtil, CircleShape, EllipseShape, \
RectangleShape
from . import plotutil
import mipylib.numeric as np
__all__ = ['Circle','Ellipse','Rectangle','Polygon']
class Circle(Graphic):
"""
A circle patch.
"""
def __init__(self, xy, radius=5, **kwargs):
"""
Create a true circle at center *xy* = (*x*, *y*) with given *radius*.
:param xy: (float, float) xy coordinates of circle centre.
:param radius: (float) Circle radius.
"""
self._center = xy
self._radius = radius
shape = CircleShape(xy[0], xy[1], radius)
legend, isunique = plotutil.getlegendbreak('polygon', **kwargs)
super(Circle, self).__init__(shape, legend)
@property
def center(self):
return self._center
@property
def radius(self):
return self._radius
class Ellipse(Graphic):
"""
A ellipse patch.
"""
def __init__(self, xy, width, height, angle=0, **kwargs):
"""
Create a ellipse at center *xy* = (*x*, *y*) with given *width* and *height*.
:param xy: (float, float) xy coordinates of ellipse centre.
:param width: (float) Ellipse width.
:param height: (float) Ellipse height.
:param angle: (float) Ellipse angle. Default is 0.
"""
self._center = xy
self._width = width
self._height = height
self._angle = angle
shape = EllipseShape(xy[0], xy[1], width, height)
shape.setAngle(angle)
legend, isunique = plotutil.getlegendbreak('polygon', **kwargs)
super(Ellipse, self).__init__(shape, legend)
@property
def center(self):
return self._center
@property
def width(self):
return self._width
@property
def height(self):
return self._height
@property
def angle(self):
return self._angle
class Rectangle(Graphic):
"""
A rectangle patch.
"""
def __init__(self, xy, width, height, angle=0, **kwargs):
"""
Create a rectangle at anchor point *xy* = (*x*, *y*) with given *width* and *height*.
:param xy: (float, float) xy coordinates of anchor point.
:param width: (float) Rectangle width.
:param height: (float) Rectangle height.
:param angle: (float) Rectangle angle. Default is 0.
"""
self._center = xy
self._width = width
self._height = height
self._angle = angle
shape = RectangleShape(xy[0], xy[1], width, height)
shape.setAngle(angle)
legend, isunique = plotutil.getlegendbreak('polygon', **kwargs)
super(Rectangle, self).__init__(shape, legend)
@property
def center(self):
return self._center
@property
def width(self):
return self._width
@property
def height(self):
return self._height
@property
def angle(self):
return self._angle
class Polygon(Graphic):
"""
A general polygon patch.
"""
def __init__(self, xy, closed=True, **kwargs):
"""
Create a polygon with *xy* point array.
:param xy: (array_like) xy point array.
:param closed: (bool) If *closed* is *True*, the polygon will be closed so the
starting and ending points are the same.
"""
if isinstance(xy, (list, tuple)):
xy = np.array(xy)
self._xy = xy
self._closed = closed
shape = ShapeUtil.createPolygonShape(xy._array)
legend, isunique = plotutil.getlegendbreak('polygon', **kwargs)
super(Polygon, self).__init__(shape, legend)
@property
def xy(self):
return self._xy