Source code for svgen.cartesian.circle
"""
svgen - A module for interacting with circular entities.
"""
# built-in
from math import isclose
from typing import NamedTuple
# internal
from svgen.attribute import SimpleAttribute
from svgen.cartesian import UNITY
from svgen.cartesian.mutate import Translation
from svgen.cartesian.point import DEFAULT_CENTER, Point, PointAttrs
[docs]
class CircleAttrs(NamedTuple):
"""A grouping for 'width' and 'center' attributes for a cicle."""
radius: SimpleAttribute
center: PointAttrs
@property
def radius_val(self) -> float:
"""Get the 'radius' value for this circle."""
return float(self.radius.value)
[docs]
class Circle(NamedTuple):
"""A radius and center describing a circle."""
radius: float
center: Point = DEFAULT_CENTER
@property
def radius_attr(self) -> SimpleAttribute:
"""Get the 'radius' attribute for this circle."""
return SimpleAttribute("r", str(self.radius))
@property
def center_attrs(self) -> PointAttrs:
"""Get the 'center' attributes for this circle."""
assert self.center.center
return self.center.attrs
@property
def attrs(self) -> CircleAttrs:
"""Get the 'radius' and 'center' attributes for this circle."""
return CircleAttrs(self.radius_attr, self.center_attrs)
[docs]
def translate(self, move: Translation) -> "Circle":
"""Move this circle by a given translation."""
return Circle(self.radius, self.center.translate(move))
[docs]
def scale(self, scale: float = UNITY) -> "Circle":
"""Scale this circle's radius."""
return Circle(self.radius * scale, self.center)
def __eq__(self, other: object) -> bool:
"""Determine if this circle is equivalent to another."""
if not isinstance(other, Circle):
return NotImplemented
return (
isclose(self.radius, other.radius) and self.center == other.center
)