chiark / gitweb /
RecursiveBezierishCurve: Try it
[moebius3.git] / recursivebezier.py
1
2 from __future__ import print_function
3
4 import numpy as np
5
6 from bezier import BezierSegment
7 from moenp import *
8
9 class RecursiveBezierishCurve():
10   def __init__(db, cp, depth=10):
11     single = BezierSegment(cp)
12     midpoint = np.array(single.point_at_t(0.5))
13     mid_dirn = single.point_at_t(0.5 + 0.001) - midpoint
14     mid_dirn /= np.linalg.norm(mid_dirn)
15     ocp_factor = 0.5
16     mid_scale = ocp_factor * 0.5 * (np.linalg.norm(cp[1] - cp[0]) +
17                                     np.linalg.norm(cp[3] - cp[2]))
18     if depth > 0:
19       constructor = lambda ccp: RecursiveBezierishCurve(ccp, depth-1)
20     else:
21       constructor = BezierSegment
22
23     db.b0 = constructor([ cp[0],
24                           cp[1] * ocp_factor + cp[0] * (1-ocp_factor),
25                           midpoint - mid_dirn * mid_scale,
26                           midpoint ])
27     db.b1 = constructor([ midpoint,
28                           midpoint + mid_dirn * mid_scale,
29                           cp[2] * ocp_factor + cp[3] * (1-ocp_factor),
30                           cp[3] ])
31   def point_at_t(db, t):
32     if t < 0.5:
33       return db.b0.point_at_t(t*2)
34     else:
35       return db.b1.point_at_t(t*2 - 1)
36