コード例 #1
0
    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
コード例 #2
0
 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
コード例 #3
0
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)
コード例 #4
0
 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
コード例 #5
0
 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
コード例 #6
0
 def coefficient(cls, n, k, ts):
     C = binomial(n, k)
     return C * ts**k * (1 - ts)**(n - k)
コード例 #7
0
 def coeff(self, k, ts):
     n = self.degree
     C = binomial(n, k)
     return C * ts**k * (1 - ts)**(n-k)