From: Ian Jackson Date: Sat, 7 Apr 2018 20:06:26 +0000 (+0100) Subject: moebius: break out moebez.py X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=c0e899c136e7675faf75d53366dc97806b6e535a;p=moebius3.git moebius: break out moebez.py 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 --- diff --git a/moebez.py b/moebez.py new file mode 100644 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) + diff --git a/moebius.py b/moebius.py index aadb42a..9235a77 100644 --- a/moebius.py +++ b/moebius.py @@ -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): '''