Source code for cxroots.contours.circle

from typing import Literal, Tuple

from numpy import pi

from ..contour import Contour
from ..paths import ComplexArc
from .annulus import Annulus


[docs] class Circle(Contour): """ A positively oriented circle in the complex plane. Parameters ---------- center : complex The center of the circle. radius : float The radius of the circle. Examples -------- .. plot:: :include-source: from cxroots import Circle circle = Circle(center=1, radius=0.5) circle.show() """ axis_names = tuple("r") def __init__(self, center: complex, radius: float): self.center = center self.radius = radius segments = [ComplexArc(center, radius, 0, 2 * pi)] super(Circle, self).__init__(segments) def __str__(self): return ( f"Circle: center={self.center.real:.3f}{self.center.imag:+.3f}i, " f"radius={self.radius:.3f}" ) def contains(self, z: complex) -> bool: """Returns True if the point z lies within the contour, False if otherwise""" return abs(z - self.center) < self.radius @property def central_point(self) -> complex: return self.center @property def area(self) -> float: return pi * self.radius**2 def subdivide( self, axis: Literal["r"] = "r", division_factor: float = 0.5 ) -> Tuple[Annulus, "Circle"]: """ Subdivide the contour Parameters ---------- axis : str, can only be 'r' The axis along which the line subdividing the contour is a constant. division_factor : float in range (0,1), optional Determines the point along 'axis' at which the line dividing the box is placed Returns ------- box1 : Annulus With inner radius determined by the division_factor and outer radius equal to that of the original circle box2 : Circle With radius equal to the inner radius of box1 """ if axis == "r": box1 = Annulus(self.center, (self.radius * division_factor, self.radius)) box2 = Circle(self.center, self.radius * division_factor) box1.segments[0] = self.segments[0] box1.segments[1]._reverse_path = box2.segments[0] box2.segments[0]._reverse_path = box1.segments[1] else: raise ValueError("axis must be 'r'") for box in [box1, box2]: box._created_by_subdivision_axis = axis box._parent = self self._children = [box1, box2] return box1, box2