def get_control_points(self): n = self.get_degree() factorials = np.empty((n, )) f = 1 for i in range(1, n + 1): factorials[i - 1] = f f *= (i + 1) A = np.zeros((n + 1, n + 1)) for t_power in range(n + 1): for ctrlpt_i in range(t_power + 1): sign = 1 if (t_power - ctrlpt_i) % 2 == 0 else -1 A[t_power, ctrlpt_i] = binomial(n, ctrlpt_i) * binomial( n - ctrlpt_i, t_power - ctrlpt_i) * sign control_points = np.empty((n + 1, 3)) for d in range(3): B = np.empty((n + 1, 1)) B[0, 0] = self.start[d] B[1:, 0] = self.derivatives[:, d] / factorials x = np.linalg.solve(A, B) control_points[:, d] = x[:, 0] return control_points
def coeff_deriv3(self, k, t): n = self.degree C = binomial(n, k) if n - k - 2 > 0: s1 = -(n - k - 2) * (n - k - 1) * (n - k) * (1 - t)**(n - k - 3) * t**k else: s1 = np.zeros_like(t) if k >= 1 and n - k - 2 > 0: s2 = 3 * k * (n - k - 1) * (n - k) * (1 - t)**(n - k - 2) * t**(k - 1) elif k >= 1 and n - k == 2: s2 = 6 * k * t**(k - 1) else: s2 = np.zeros_like(t) if k >= 2 and n - k - 1 > 0: s3 = -3 * (k - 1) * k * (n - k) * (1 - t)**(n - k - 1) * t**(k - 2) elif k >= 2 and n - k == 1: s3 = -3 * (k - 1) * k * t**(k - 2) else: s3 = np.zeros_like(t) if k >= 3: s4 = (k - 2) * (k - 1) * k * (1 - t)**(n - k) * t**(k - 3) else: s4 = np.zeros_like(t) coeff = s1 + s2 + s3 + s4 return C * coeff
def elevate_bezier_degree(self_degree, control_points, delta=1): # See "The NURBS book" (2nd edition), p.5.5, eq. 5.36 t = delta p = self_degree new_points = [] P = control_points for i in range(p + t + 1): j0 = max(0, i - t) j1 = min(p, i) js = range(j0, j1 + 1) c1 = np.array([binomial(p, j) for j in js]) c2 = np.array([binomial(t, i - j) for j in js]) ps = P[j0:j1 + 1, :] numerator = (c1 * c2)[np.newaxis].T * ps denominator = binomial(p + t, i) #print(f"E: p {p}, i {i}, c1 {c1}, c2 {c2}, denom {denominator}, ps {ps}") point = numerator.sum(axis=0) / denominator new_points.append(point) return np.array(new_points)
def coeff_deriv1(self, k, t): n = self.degree C = binomial(n, k) if k >= 1: s1 = k * (1 - t)**(n - k) * t**(k - 1) else: s1 = np.zeros_like(t) if n - k - 1 > 0: s2 = -(n - k) * (1 - t)**(n - k - 1) * t**k elif n - k == 1: s2 = -t**k else: s2 = np.zeros_like(t) coeff = s1 + s2 return C * coeff
def coeff_deriv2(self, k, t): n = self.degree C = binomial(n, k) if n - k - 2 > 0: s1 = (n - k - 1) * (n - k) * (1 - t)**(n - k - 2) * t**k elif n - k == 2: s1 = 2 * t**k else: s1 = np.zeros_like(t) if k >= 1 and n - k - 1 > 0: s2 = -2 * k * (n - k) * (1 - t)**(n - k - 1) * t**(k - 1) elif k >= 1 and n - k == 1: s2 = -2 * k * t**(k - 1) else: s2 = np.zeros_like(t) if k >= 2: s3 = (k - 1) * k * (1 - t)**(n - k) * t**(k - 2) else: s3 = np.zeros_like(t) coeff = s1 + s2 + s3 return C * coeff
def coefficient(cls, n, k, ts): C = binomial(n, k) return C * ts**k * (1 - ts)**(n - k)
def coeff(self, k, ts): n = self.degree C = binomial(n, k) return C * ts**k * (1 - ts)**(n-k)