Skip to content

Instantly share code, notes, and snippets.

@orbingol
Created April 20, 2018 21:49
Show Gist options
  • Save orbingol/76d9f52f1c90afb5d2d201eb4ad14126 to your computer and use it in GitHub Desktop.
Save orbingol/76d9f52f1c90afb5d2d201eb4ad14126 to your computer and use it in GitHub Desktop.
Generates a uniform knot vector for NURBS evaluations
import numpy as np
def generate_knot_vector(degree, num_ctrlpts, **kwargs):
""" Generates a uniform knot vector.
Example
-------
>>> generate_knot_vector(3, 7, datatype=np.float32)
array([0. , 0. , 0. , 0. , 0.25, 0.5 , 0.75, 1. , 1. , 1. , 1. ], dtype=float32)
:param degree: degree
:param num_ctrlpts: number of control points
:return: generated knot vector
"""
dt = kwargs.get('datatype', np.float32)
# Equation to use: m = n + p + 1
# p: degree, n+1: number of control points; m+1: number of knots
m = degree + num_ctrlpts + 1
# Initialize the knot vector with zeros
knot_vector = np.zeros(m, dtype=dt)
# Calculate a uniform interval for middle knots
num_segments = num_ctrlpts - (degree + 1) # number of knots in the middle
middle_knots = np.linspace(0.0, 1.0, num=num_segments + 2) # add 0 and 1
# Middle knots
knot_vector[degree:-degree] = middle_knots
# Last knots
knot_vector[-degree:] = 1.0
return knot_vector
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment