From 902cde9f15241af39223b636baf3cd93f3cb8f2f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 5 Nov 2017 15:33:13 +0000 Subject: [PATCH] use DoubleCubicBezier Signed-off-by: Ian Jackson --- moebius.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/moebius.py b/moebius.py index d9888d2..dea2e12 100644 --- a/moebius.py +++ b/moebius.py @@ -15,6 +15,29 @@ unit_x = np.array((1,0,0)) unit_y = np.array((0,1,0)) unit_z = np.array((0,0,1)) +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 @@ -76,7 +99,7 @@ class MoebiusHalf: # file=sys.stderr) cp[1] = cp[0] + cp1scale * m.edge .dirn (theta) cp[2] = cp[3] + cp2scale * m.midline.dirn (theta*2) - return BezierSegment(cp) + return DoubleCubicBezier(cp) def point(m, iu, t): ''' 0 <= iu <= nu meaning 0 <= u <= 1 -- 2.30.2