chiark / gitweb /
moebius: break out moebez.py
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Apr 2018 20:06:26 +0000 (21:06 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Apr 2018 20:06:27 +0000 (21:06 +0100)
curveopt is going to want these.  We need to move it into a separate
file to avoid a circular import dependency.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
moebez.py [new file with mode: 0644]
moebius.py

diff --git a/moebez.py b/moebez.py
new file mode 100644 (file)
index 0000000..1ad7b4d
--- /dev/null
+++ b/moebez.py
@@ -0,0 +1,39 @@
+
+from __future__ import print_function
+
+from bezier import BezierSegment
+from moedebug import *
+from moenp import *
+
+class DoubleCubicBezier():
+  def __init__(db, cp):
+    single = BezierSegment(cp)
+    midpoint = np.array(single.point_at_t(0.5))
+    mid_dirn = single.point_at_t(0.5 + 0.001) - midpoint
+    mid_dirn /= np.linalg.norm(mid_dirn)
+    ocp_factor = 0.5
+    mid_scale = ocp_factor * 0.5 * (np.linalg.norm(cp[1] - cp[0]) +
+                                    np.linalg.norm(cp[3] - cp[2]))
+    db.b0 = BezierSegment([ cp[0],
+                            cp[1] * ocp_factor + cp[0] * (1-ocp_factor),
+                            midpoint - mid_dirn * mid_scale,
+                            midpoint ])
+    db.b1 = BezierSegment([ midpoint,
+                            midpoint + mid_dirn * mid_scale,
+                            cp[2] * ocp_factor + cp[3] * (1-ocp_factor),
+                            cp[3] ])
+  def point_at_t(db, t):
+    if t < 0.5:
+      return db.b0.point_at_t(t*2)
+    else:
+      return db.b1.point_at_t(t*2 - 1)
+
+class DiscreteBezier():
+  def __init__(b, cp, nt, bezier_constructor=DoubleCubicBezier):
+    b.nt = nt
+    b._t_vals = np.linspace(0, 1, b.nt+1)
+    b._continuous_bezier = bezier_constructor(cp)
+  def point_at_it(b, it):
+    t = b._t_vals[it]
+    return b._continuous_bezier.point_at_t(t)
+
index aadb42ad8b88679c84b8b7755c14e9af1f889048..9235a7755ca7764ba7192a3d96b22f6832ef533a 100644 (file)
@@ -6,32 +6,10 @@ from numpy import cos, sin
 
 from bezier import BezierSegment
 from moenp import *
+from moebez import *
 
 import sys
 
-class DoubleCubicBezier():
-  def __init__(db, cp):
-    single = BezierSegment(cp)
-    midpoint = np.array(single.point_at_t(0.5))
-    mid_dirn = single.point_at_t(0.5 + 0.001) - midpoint
-    mid_dirn /= np.linalg.norm(mid_dirn)
-    ocp_factor = 0.5
-    mid_scale = ocp_factor * 0.5 * (np.linalg.norm(cp[1] - cp[0]) +
-                                    np.linalg.norm(cp[3] - cp[2]))
-    db.b0 = BezierSegment([ cp[0],
-                            cp[1] * ocp_factor + cp[0] * (1-ocp_factor),
-                            midpoint - mid_dirn * mid_scale,
-                            midpoint ])
-    db.b1 = BezierSegment([ midpoint,
-                            midpoint + mid_dirn * mid_scale,
-                            cp[2] * ocp_factor + cp[3] * (1-ocp_factor),
-                            cp[3] ])
-  def point_at_t(db, t):
-    if t < 0.5:
-      return db.b0.point_at_t(t*2)
-    else:
-      return db.b1.point_at_t(t*2 - 1)
-
 class ParametricCircle:
   def __init__(pc, c, r0, r1):
     ''' circle centred on c
@@ -68,15 +46,6 @@ class Twirler(ParametricCircle):
     r = tw.radius(theta)
     return cos(zeta) * r + sin(zeta) * tw._axis
 
-class DiscreteBezier():
-  def __init__(b, cp, nt, bezier_constructor=DoubleCubicBezier):
-    b.nt = nt
-    b._t_vals = np.linspace(0, 1, b.nt+1)
-    b._continuous_bezier = bezier_constructor(cp)
-  def point_at_it(b, it):
-    t = b._t_vals[it]
-    return b._continuous_bezier.point_at_t(t)
-
 class MoebiusHalf:
   def __init__(m, nu, nt):
     '''