Created
April 20, 2018 21:49
-
-
Save orbingol/76d9f52f1c90afb5d2d201eb4ad14126 to your computer and use it in GitHub Desktop.
Generates a uniform knot vector for NURBS evaluations
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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