如果NURBS曲线的控制点已知,如何找到结矢量?

时间:2018-03-12 09:57:40

标签: python curve-fitting bspline nurbs basis

我有一套控制点

pts = [[849, 1181],
       [916, 1257],
       [993, 1305],
       [1082,1270], 
       [1137,1181],
       [1118,1055], 
       [993,1034], 
       [873,1061], 
       [849, 1181]]

我有生成打开结矢量的逻辑:

/*
Subroutine to generate a B-spline open knot vector with multiplicity
equal to the order at the ends.

c            = order of the basis function
n            = the number of defining polygon vertices
nplus2       = index of x() for the first occurence of the maximum knot       vector value
nplusc       = maximum value of the knot vector -- $n + c$
x()          = array containing the knot vector
*/

knot(n,c,x)

int n,c;
int x[];

{
    int nplusc,nplus2,i;
nplusc = n + c;
nplus2 = n + 2;

x[1] = 0;
    for (i = 2; i <= nplusc; i++){
        if ( (i > c) && (i < nplus2) )
            x[i] = x[i-1] + 1;
    else
            x[i] = x[i-1];


    }
}

另一个用于生成周期性结矢量的文件:

/*  Subroutine to generate a B-spline uniform (periodic) knot vector.

c            = order of the basis function
n            = the number of defining polygon vertices
nplus2       = index of x() for the first occurence of the maximum knot vector value
nplusc       = maximum value of the knot vector -- $n + c$
x[]          = array containing the knot vector
*/

#include    <stdio.h>

knotu(n,c,x)

int n,c;
int x[];

{
    int nplusc,nplus2,i;

nplusc = n + c;
nplus2 = n + 2;

x[1] = 0;
for (i = 2; i <= nplusc; i++){
    x[i] = i-1;
}
}
然而,我需要生成[0,1]

范围内的非均匀结矢量

上述算法产生均匀的结矢量。

请建议是否有办法做到这一点。如果代码是python

,那将是更好的选择

1 个答案:

答案 0 :(得分:0)

结矢量(均匀或不均匀)是NURBS曲线定义的一部分。因此,只要结矢量遵循基本规则,您就可以实际定义自己的非均匀结矢量:

1)结点数#=控制点数+订单

2)所有结值必须不减少。即,k [i] <= k [i + 1]。

对于具有9个控制点的示例,您可以使用非均匀的结矢量,如[0,0,0,0,a,b,c,d,e,1,1,1,1],其中0.0 &LT; a&lt; = b&lt; = c&lt; = d&lt; = e&lt; 1.0度为3 B样条曲线。当然,为a,b,c,d和e选择不同的值将导致具有不同形状的曲线。