chiark / gitweb /
simplex wip: use gsl_vector_get for X, for abandonment
[moebius3.git] / moebez.py
1
2 from __future__ import print_function
3
4 from bezier import BezierSegment
5 from moedebug import *
6 from moenp import *
7
8 class DoubleCubicBezier():
9   def __init__(db, cp):
10     single = BezierSegment(cp)
11     midpoint = np.array(single.point_at_t(0.5))
12     mid_dirn = single.point_at_t(0.5 + 0.001) - midpoint
13     mid_dirn /= np.linalg.norm(mid_dirn)
14     ocp_factor = 0.5
15     mid_scale = ocp_factor * 0.5 * (np.linalg.norm(cp[1] - cp[0]) +
16                                     np.linalg.norm(cp[3] - cp[2]))
17     db.b0 = BezierSegment([ cp[0],
18                             cp[1] * ocp_factor + cp[0] * (1-ocp_factor),
19                             midpoint - mid_dirn * mid_scale,
20                             midpoint ])
21     db.b1 = BezierSegment([ midpoint,
22                             midpoint + mid_dirn * mid_scale,
23                             cp[2] * ocp_factor + cp[3] * (1-ocp_factor),
24                             cp[3] ])
25   def point_at_t(db, t):
26     if t < 0.5:
27       return db.b0.point_at_t(t*2)
28     else:
29       return db.b1.point_at_t(t*2 - 1)
30
31 class DiscreteBezier():
32   def __init__(b, cp, nt, bezier_constructor=DoubleCubicBezier):
33     b.nt = nt
34     b._t_vals = np.linspace(0, 1, b.nt+1)
35     b._continuous_bezier = bezier_constructor(cp)
36   def point_at_it(b, it):
37     t = b._t_vals[it]
38     return b._continuous_bezier.point_at_t(t)
39