diff options
Diffstat (limited to 'src/cython/_cy_conicsection.pyx')
-rw-r--r-- | src/cython/_cy_conicsection.pyx | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/cython/_cy_conicsection.pyx b/src/cython/_cy_conicsection.pyx new file mode 100644 index 0000000..91bbd73 --- /dev/null +++ b/src/cython/_cy_conicsection.pyx @@ -0,0 +1,183 @@ +from cython.operator cimport dereference as deref +from numbers import Number +from _cy_rectangle cimport cy_OptInterval, wrap_OptInterval, wrap_Rect, OptRect, wrap_OptRect +from _cy_rectangle cimport cy_Interval, wrap_Interval + +from _cy_affine cimport cy_Affine, wrap_Affine, get_Affine, is_transform + +from _cy_curves cimport is_Curve, get_Curve_p +from _cy_path cimport wrap_Path + + +cdef class cy_Circle: + + """Circle in 2D plane. + + Corresponds to Circle class in 2geom. + """ + + cdef Circle* thisptr + + def __cinit__(self, cy_Point center=None, double r=0): + """Create circle from center and radius.""" + if center is None: + self.thisptr = new Circle() + else: + self.thisptr = new Circle(deref( center.thisptr ), r) + + @classmethod + def from_coefficients(self, double A, double B, double C, double D): + """Create circle form implicit equation coefficients: + + Implicit equation is Ax**2 + Ay**2 + Bx + Cy + D = 0 + """ + return wrap_Circle( Circle(A, B, C, D) ) + + @classmethod + def from_points(self, points): + """Create best fitting circle from at least three points.""" + return wrap_Circle( Circle( make_vector_point(points) ) ) + + def set_center(self, cy_Point c): + """Set coordinates of center.""" + self.thisptr.setCenter(deref(c.thisptr)) + + def set_radius(self, double r): + """Set the circle's radius.""" + self.thisptr.setRadius(r) + + def set_coefficients(self, double A, double B, double C, double D): + """Set implicit equation coefficients: + + Implicit equation is Ax**2 + Ay**2 + Bx + Cy + D = 0 + """ + self.thisptr.set(A, B, C, D) + + def fit(self, points): + """Set circle to the best fit of at least three points.""" + self.thisptr.fit( make_vector_point(points) ) + + def arc(self, cy_Point initial, cy_Point inner, cy_Point final, bint _svg_compliant=True): + """Get (SVG)EllipticalArc. + + Args: + initial: Initial point of arc + inner: Inner point of arc. + final: Final point of arc. + """ + return wrap_EllipticalArc( deref(self.thisptr.arc(deref( initial.thisptr ), deref( inner.thisptr ), deref( final.thisptr ))) ) + + def center(self): + """Get center of circle in point.""" + return wrap_Point(self.thisptr.center()) + + def radius(self): + """Get radius of circle.""" + return self.thisptr.radius() + +cdef cy_Circle wrap_Circle(Circle p): + cdef Circle * retp = new Circle() + retp[0] = p + cdef cy_Circle r = cy_Circle.__new__(cy_Circle) + r.thisptr = retp + return r + +cdef class cy_Ellipse: + """Ellipse in 2D plane. + + Corresponds to Ellipse class in 2geom. + """ + + cdef Ellipse* thisptr + + def __cinit__(self, cy_Point center=None, rx=0, ry=0, double a=0): + """Create new ellipse: + + Args: + center: Center of ellipse (between foci) + rx, ry: major and minor semi-axis. + a: angle of major axis. + """ + if center is None: + self.thisptr = new Ellipse() + else: + self.thisptr = new Ellipse(center.x, center.y, rx, ry, a) + + @classmethod + def from_coefficients(cls, double A, double B, double C, double D, double E, double F): + """Create ellipse from coefficients of implicit equation. + + Implicit equation has form Ax**2 + Bxy + Cy**2 + Dx + Ey + F = 0 + """ + return wrap_Ellipse(Ellipse(A, B, C, D, E, F)) + + @classmethod + def from_circle(cls, cy_Circle c): + """Create ellipse identical to circle.""" + return wrap_Ellipse(Ellipse(deref( c.thisptr ))) + + @classmethod + def from_points(cls, points): + """Create ellipse fitting at least 5 points.""" + return wrap_Ellipse( Ellipse( make_vector_point(points) ) ) + + def set(self, cy_Point center, double rx, double ry, double a): + """Set center, rays and angle of ellipse. + + Args: + center: Center of ellipse. + rx, ry: Major and minor semi-axis. + a: angle of major axis. + self.thisptr.set(center.x, center.y, rx, ry, a) + """ + + def set_coefficients(self, double A, double B, double C, double D, double E, double F): + """Set coefficients of implicit equation. + + Implicit equation has form Ax**2 + Bxy + Cy**2 + Dx + Ey + F = 0 + """ + self.thisptr.set(A, B, C, D, E, F) + + def set_points(self, points): + """Set ellipse to the best fit of at least five points.""" + self.thisptr.set( make_vector_point(points) ) + + def arc(self, cy_Point initial, cy_Point inner, cy_Point final, bint svg_compliant=True): + """Get (SVG)EllipticalArc. + + Args: + initial: Initial point of arc + inner: Inner point of arc. + final: Final point of arc. + """ + return wrap_EllipticalArc( deref(self.thisptr.arc(deref( initial.thisptr ), deref( inner.thisptr ), deref( final.thisptr ))) ) + + def center(self): + """Get center of ellipse.""" + return wrap_Point(self.thisptr.center()) + + def ray(self, Dim2 d): + """Get major/minor semi-axis.""" + return self.thisptr.ray(d) + + def rot_angle(self): + """Get angle of major axis.""" + return self.thisptr.rot_angle() + + def implicit_form_coefficients(self): + """Get coefficients of implicit equation in list.""" + return wrap_vector_double(self.thisptr.implicit_form_coefficients()) + + def transformed(self, m): + """Return transformed ellipse.""" + cdef Affine at + if is_transform(m): + at = get_Affine(m) + return wrap_Ellipse(self.thisptr.transformed(at)) + +cdef cy_Ellipse wrap_Ellipse(Ellipse p): + cdef Ellipse * retp = new Ellipse() + retp[0] = p + cdef cy_Ellipse r = cy_Ellipse.__new__(cy_Ellipse) + r.thisptr = retp + return r |