(degree, ctrlpts, **kwargs)
return pts_elev
Computes the control points of the rational/non-rational spline after degree elevation.

    Implementation of Eq. 5.36 of The NURBS Book by Piegl & Tiller, 2nd Edition, p.205

    Keyword Arguments:
        * ``num``: number of degree elevations

    Please note that degree elevation algorithm can only operate on Bezier shapes, i.e. curves, surfaces, volumes.

    :param degree: degree
    :type degree: int
    :param ctrlpts: control points
    :type ctrlpts: list, tuple
    :return: control points of the degree-elevated shape
    :rtype: list
Computes the control points of the rational/non-rational spline after degree elevation.
Computes the control points of the rational / non - rational spline after degree elevation .
def degree_elevation(degree, ctrlpts, **kwargs):
    """ Computes the control points of the rational/non-rational spline after degree elevation.

    Implementation of Eq. 5.36 of The NURBS Book by Piegl & Tiller, 2nd Edition, p.205

    Keyword Arguments:
        * ``num``: number of degree elevations

    Please note that degree elevation algorithm can only operate on Bezier shapes, i.e. curves, surfaces, volumes.

    :param degree: degree
    :type degree: int
    :param ctrlpts: control points
    :type ctrlpts: list, tuple
    :return: control points of the degree-elevated shape
    :rtype: list
    """
    # Get keyword arguments
    num = kwargs.get('num', 1)  # number of degree elevations
    check_op = kwargs.get('check_num', True)  # enable/disable input validation checks

    if check_op:
        if degree + 1 != len(ctrlpts):
            raise GeomdlException("Degree elevation can only work with Bezier-type geometries")
        if num <= 0:
            raise GeomdlException("Cannot degree elevate " + str(num) + " times")

    # Initialize variables
    num_pts_elev = degree + 1 + num
    pts_elev = [[0.0 for _ in range(len(ctrlpts[0]))] for _ in range(num_pts_elev)]

    # Compute control points of degree-elevated 1-dimensional shape
    for i in range(0, num_pts_elev):
        start = max(0, (i - num))
        end = min(degree, i)
        for j in range(start, end + 1):
            coeff = linalg.binomial_coefficient(degree, j) * linalg.binomial_coefficient(num, (i - j))
            coeff /= linalg.binomial_coefficient((degree + num), i)
            pts_elev[i] = [p1 + (coeff * p2) for p1, p2 in zip(pts_elev[i], ctrlpts[j])]

    # Return computed control points after degree elevation
    return pts_elev
def degree_elevation ( degree , ctrlpts , * * kwargs ) : # Get keyword arguments num = kwargs . get ( 'num' , 1 ) # number of degree elevations check_op = kwargs . get ( 'check_num' , True ) # enable/disable input validation checks if check_op : if degree + 1 != len ( ctrlpts ) : raise GeomdlException ( "Degree elevation can only work with Bezier-type geometries" ) if num <= 0 : raise GeomdlException ( "Cannot degree elevate " + str ( num ) + " times" ) # Initialize variables num_pts_elev = degree + 1 + num pts_elev = [ [ 0.0 for _ in range ( len ( ctrlpts [ 0 ] ) ) ] for _ in range ( num_pts_elev ) ] # Compute control points of degree-elevated 1-dimensional shape for i in range ( 0 , num_pts_elev ) : start = max ( 0 , ( i - num ) ) end = min ( degree , i ) for j in range ( start , end + 1 ) : coeff = linalg . binomial_coefficient ( degree , j ) * linalg . binomial_coefficient ( num , ( i - j ) ) coeff /= linalg . binomial_coefficient ( ( degree + num ) , i ) pts_elev [ i ] = [ p1 + ( coeff * p2 ) for p1 , p2 in zip ( pts_elev [ i ] , ctrlpts [ j ] ) ] # Return computed control points after degree elevation return pts_elev