summaryrefslogtreecommitdiffstats
path: root/src/cython/_cy_conicsection.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'src/cython/_cy_conicsection.pyx')
-rw-r--r--src/cython/_cy_conicsection.pyx183
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