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 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 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)
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())
""" 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')