def Newton_bezier(t, b, ivar, val, itmax, tol):
    d = lbez.diff(b)
    for it in range(itmax):
        f = lbez.eval_bezier_curve(b, t) - val
        if abs(f[ivar]) < tol:
            return t
        df = lbez.eval_bezier_curve(d, t)
        if abs(df[ivar]) < 1e-15:
            return None
        dt = -f[ivar] / df[ivar]
        t += dt
    return None
def bezier_extremal_values(b, ivar):
    d = lbez.diff(b)
    A = d[2][ivar] - 2 * d[1][ivar] + d[0][ivar]
    if abs(A) < 1e-15:
        return [0.5 * d[0][ivar] / (d[0][ivar] - d[1][ivar])]
    else:
        B = d[1][ivar] - d[0][ivar]
        C = d[0][ivar]
        sqrtdelta = numpy.sqrt(B**2 - A * C)
        t = []
        for sign in [-1, 1]:
            ts = (sign * sqrtdelta - B) / A
            if ts >= 0 and ts <= 1: t.append(ts)
        if len(t) < 1:
            fig, ax = plt.subplots()
            u = numpy.linspace(0, 1, 100)
            xy = lbez.eval_bezier_curve(d, u)
            ax.plot(u, xy[:, ivar])
            ax.plot([0, 1], [0, 0], 'k--')
            ax.set_aspect('equal')
            plt.show()
        return t
def Newton_intersection(curves, t, itmax=30, tol=1e-6, verbose=False):
    deriv = [lbez.diff(b) for b in curves]
    for it in range(itmax):
        if verbose: print 'it. #%d, t = (%s, %s)' % (it, t[0], t[1])
        xy = [lbez.eval_bezier_curve(curves[i], t[i]) for i in range(2)]
        if verbose:
            for i in range(2):
                print '   xy_%d = (%s, %s)' % (i, xy[i][0], xy[i][1])
        res = xy[1] - xy[0]
        if verbose: print '   |res| = %s' % (numpy.hypot(res[0], res[1]))
        #
        if sum(res**2) < tol**2:
            return t
        #
        dxy = [lbez.eval_bezier_curve(deriv[i], t[i]) for i in range(2)]
        dxy[1] = -dxy[1]
        det = dxy[0][0] * dxy[1][1] - dxy[0][1] * dxy[1][0]
        if verbose: print '   |det| = %s\n' % (abs(det))
        if abs(det) < 1e-15:
            return None
        t[0] += (res[0] * dxy[1][1] - res[1] * dxy[1][0]) / det
        t[1] += (dxy[0][0] * res[1] - dxy[0][1] * res[0]) / det
    return None
 def update(self):
     self.xt = lbez.diff(self.x)
     self.xtt = lbez.diff(self.xt)
     return
polys = []
for path in paths:
    poly = numpy.empty((0, 2))
    bpoly = numpy.empty((0, 2))
    for i, segm in enumerate(path):
        xy = lbez.eval_bezier_curve(segm, t)
        poly = numpy.vstack([poly, xy])
        bpoly = numpy.vstack([bpoly, segm])
    polys.append(poly)
    bpolys.append(bpoly)
##############################

##############################
# EDIT
# body (right)
d = lbez.diff(paths[0][3])
t0 = 0.5 * d[0][1] / (d[0][1] - d[1][1])

paths[0][3] = lbez.reparameterize_bezier_curve(paths[0][3], end=t0)
xy0 = paths[0][3][3]

t1 = Newton_bezier(0, paths[0][4], 1, xy0[1], 20, 1e-6)
paths[0][4] = lbez.reparameterize_bezier_curve(paths[0][4], start=t1)

paths[0] = insert_joint(paths[0], after=3, tension=0)

# body (left)
paths[0] = paths[0][:7]
for i in range(7):
    bsym = paths[0][6 - i][-1::-1].copy()
    bsym[:, 0] = -bsym[:, 0]
Exemple #6
0
import numpy
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import sys
sys.path.append('/d/bandrieu/GitHub/Code/Python')
import lib_bezier as lbez

b = numpy.array([[0, 0], [0.3, 1], [1, 1], [1, 0], [1, -1], [1.5, -0.5],
                 [2, 0]])
#b = b[0:4]
"""
b = numpy.array([(0,0), (2,1)])
"""
b = b + 0.4 * (2 * numpy.random.rand(b.shape[0], b.shape[1]) - 1)

db = lbez.diff(b)

n = 100
t = numpy.linspace(0, 1, n)
"""
p = numpy.zeros((n,2))
for i in range(n):
    f, bl, br = lbez.de_casteljau(b, t[i])
    for j in range(2):
        p[i,j] = f[j]
"""

p = lbez.eval_bezier_curve(b, t)
dp = lbez.eval_bezier_curve(db, t)
#print dp