예제 #1
0
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
예제 #2
0
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
예제 #3
0
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 evald2(self, t):
     return lbez.eval_bezier_curve(self.xtt, t)
 def eval(self, t):
     return lbez.eval_bezier_curve(self.x, t)
예제 #6
0
if False:
    fig, ax = plt.subplots()

    f = open('teapot_profile_bcp.dat', 'r')
    j = 0
    while True:
        j += 1
        line = f.readline()
        if ("" == line): break  # end of file
        b[0] = [float(a) for a in line.split()]
        for i in range(1, 4):
            b[i] = [float(a) for a in f.readline().split()]
            line = f.readline()
            #
        p = lbez.eval_bezier_curve(b, t)
        ax.plot(p[:, 0], p[:, 1])
        ax.text(p[k, 0], p[k, 1], str(j))
    f.close()

    ax.set_aspect('equal')
    plt.show()

##############################
# READ
f = open('teapot_elems_profile_bcp.dat', 'r')
npaths = int(f.readline())
paths = []
for ipath in range(npaths):
    segms = []
    nsegms = int(f.readline())
예제 #7
0
"""
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

fig, ax = plt.subplots()

aabb = lbez.AABB_2d_bezier_curve(b)
ctr, rng, axe = lbez.OBB_2d_bezier_curve(b)

ax.plot(p[:, 0], p[:, 1], 'k-')
ax.plot(b[:, 0], b[:, 1], 'r.-')

#ax.quiver(p[:,0], p[:,1], dp[:,0], dp[:,1], color='b')
#ax.quiver(p[:,0], p[:,1], -dp[:,1], dp[:,0], color='b')

#ax.plot(dp[:,0], dp[:,1], 'b')