伯恩斯坦多项式(Bernstein Polynomials)

多项式是非常有用的数学工具,因为它们定义简单,可以在计算机系统上快速计算,并代表各种函数。多项式可以很容易进行微分和积分,并且可以拼接在一起形成样条曲线,该曲线可以逼近任何函数,达到所需的任何精度。我们在小学四年级就已经学过多项式的相关知识,让我们来回顾一下
p ( t ) = a n t n + a n − 1 t n − 1 + ⋯ + a 1 t + a 0 (1) p(t)=a_nt^n+a_{n-1}t^{n-1}+\cdots+a_1t+a_0 \tag{1} p(t)=antn+an1tn1++a1t+a0(1)
上式表示某些初等多项式的 { 1 , t , t 2 , … , t n } \{1,t,t^2,\dots,t^n\} {1,t,t2,,tn}的线性组合。

通常来说,次数小于 n n n的多项式函数都可以写成式(1)这种形式,原因很简单

  • 次数小于或等于 n n n的一组多项式构成一个向量空间:多项式可以相加,可以乘以一个标量,且所有向量空间的性质都保持不变。
  • { 1 , t , t 2 , … , t n } \{1,t,t^2,\dots,t^n\} {1,t,t2,,tn}这组函数可以作为此向量空间的基,也就是说,任何次数小于或等于 n n n的多项式都可以被这组基唯一的线性表示出来。

这组基通常称为幂基(power basis),其只是多项式空间无穷多个基中其中的一个。

下面我们开始讨论多项式空间中的另一种常用的基——伯恩斯坦基(Bernstein basis),并讨论其性质。

伯恩斯坦多项式(Bernstein Polynomials)

n n n次伯恩斯坦多项式定义为
B i , n ( t ) = ( n i ) t i ( 1 − t ) n − i (2) B_{i, n}(t)=\left(\begin{array}{l} n \\ i \end{array}\right) t^{i}(1-t)^{n-i} \tag{2} Bi,n(t)=(ni)ti(1t)ni(2)
i = 0 , 1 , ⋯   , n i=0,1,\cdots,n i=0,1,,n,其中
( n i ) = n ! i ! ( n − i ) ! \left(\begin{array}{l} n \\ i \end{array}\right) = \frac{n!}{i!(n-i)!} (ni)=i!(ni)!n!
从定义我们可以看出,共有 n + 1 n+1 n+1 n n n次的伯恩斯坦多项式。为了方便,当 i < 0 i<0 i<0 i > n i>n i>n时,我们令 B i , n = 0 B_{i,n}=0 Bi,n=0

  • 一次的伯恩斯坦多项式为
    B 0 , 1 ( t ) = 1 − t B 1 , 1 ( t ) = t \begin{array}{l} B_{0,1}(t)=1-t \\ B_{1,1}(t)=t \end{array} B0,1(t)=1tB1,1(t)=t
    0 ≤ t ≤ 1 0\leq t \leq 1 0t1时,我们可以画出其图像

    image-20210505211718400

  • 二次伯恩斯坦多项式为
    B 0 , 2 ( t ) = ( 1 − t ) 2 B 1 , 2 ( t ) = 2 t ( 1 − t ) B 2 , 2 ( t ) = t 2 \begin{array}{l} B_{0,2}(t)=(1-t)^2 \\ B_{1,2}(t)=2t(1-t) \\ B_{2,2}(t)=t^2 \end{array} B0,2(t)=(1t)2B1,2(t)=2t(1t)B2,2(t)=t2
    0 ≤ t ≤ 1 0\leq t \leq 1 0t1时,我们可以画出其图像

    image-20210505212322316

  • 三次伯恩斯坦多项式为
    B 0 , 3 ( t ) = ( 1 − t ) 3 B 1 , 3 ( t ) = 3 t ( 1 − t ) 2 B 2 , 3 ( t ) = 3 t 2 ( 1 − t ) B 3 , 3 ( t ) = t 3 \begin{array}{l} B_{0,3}(t)=(1-t)^3 \\ B_{1,3}(t)=3t(1-t)^2 \\ B_{2,3}(t)=3t^2(1-t) \\ B_{3,3}(t)=t^3 \end{array} B0,3(t)=(1t)3B1,3(t)=3t(1t)2B2,3(t)=3t2(1t)B3,3(t)=t3
    0 ≤ t ≤ 1 0\leq t \leq 1 0t1时,我们可以画出其图像

伯恩斯坦多项式的递归定义

n n n阶伯恩斯坦多项式可以定义为两个 n − 1 n-1 n1阶伯恩斯坦多项式的混合。也就是说第 k k k n n n阶伯恩斯坦多项式可以写成
B k , n ( t ) = ( 1 − t ) B k , n − 1 ( t ) + t B k − 1 , n − 1 ( t ) (3) B_{k,n}(t)=(1-t)B_{k,n-1}(t)+tB_{k-1,n-1}(t) \tag{3} Bk,n(t)=(1t)Bk,n1(t)+tBk1,n1(t)(3)
为了证明式(3)成了,我们只需用到伯恩斯坦多项式的定义和一些简单的代数:
( 1 − t ) B k , n − 1 ( t ) + t B k − 1 , n − 1 ( t ) = ( 1 − t ) ( n − 1 k ) t k ( 1 − t ) n − 1 − k + t ( n − 1 k − 1 ) t k − 1 ( 1 − t ) n − 1 − ( k − 1 ) = ( n − 1 k ) t k ( 1 − t ) n − k + ( n − 1 k − 1 ) t k ( 1 − t ) n − k = [ ( n − 1 k ) + ( n − 1 k − 1 ) ] t k ( 1 − t ) n − k = ( n k ) t k ( 1 − t ) n − k = B k , n ( t ) \begin{aligned} (1-t) B_{k, n-1}(t)+t B_{k-1, n-1}(t) &=(1-t)\left(\begin{array}{c} n-1 \\ k \end{array}\right) t^{k}(1-t)^{n-1-k}+t\left(\begin{array}{l} n-1 \\ k-1 \end{array}\right) t^{k-1}(1-t)^{n-1-(k-1)} \\ &=\left(\begin{array}{c} n-1 \\ k \end{array}\right) t^{k}(1-t)^{n-k}+\left(\begin{array}{c} n-1 \\ k-1 \end{array}\right) t^{k}(1-t)^{n-k} \\ &=\left[\left(\begin{array}{c} n-1 \\ k \end{array}\right)+\left(\begin{array}{l} n-1 \\ k-1 \end{array}\right)\right] t^{k}(1-t)^{n-k} \\ &=\left(\begin{array}{l} n \\ k \end{array}\right) t^{k}(1-t)^{n-k} \\ &=B_{k, n}(t) \end{aligned} (1t)Bk,n1(t)+tBk1,n1(t)=(1t)(n1k)tk(1t)n1k+t(n1k1)tk1(1t)n1(k1)=(n1k)tk(1t)nk+(n1k1)tk(1t)nk=[(n1k)+(n1k1)]tk(1t)nk=(nk)tk(1t)nk=Bk,n(t)

伯恩斯坦多项式是非负的

如果一个函数 f ( t ) f(t) f(t)在区间 [ a , b ] [a,b] [a,b]上满足 f ( t ) ≥ 0 f(t) \geq 0 f(t)0,则这个函数就是非负的。每一个 n n n次的伯恩斯坦多项式在区间 [ 0 , 1 ] [0,1] [0,1]上都是非负的。我们可以通过递归定义来证明此性质。

很容易,我们可以知道一次伯恩斯坦多项式 B 0 , 1 ( t ) = 1 − t B_{0,1}(t)=1-t B0,1(t)=1t B 1 , 1 ( t ) = t B_{1,1}(t)=t B1,1(t)=t 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1上是非负的。我们假设所有不大于 k k k次的伯恩斯坦多项式都是非负的,则我们使用递归定义
B i , k ( t ) = ( 1 − t ) B i , k − 1 ( t ) + t B i − 1 , k − 1 ( t ) B_{i,k}(t)=(1-t)B_{i,k-1}(t)+tB_{i-1,k-1}(t) Bi,k(t)=(1t)Bi,k1(t)+tBi1,k1(t)
由于等式右边所有的项在 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1上都是非负的,则我们可以认为 B i , k ( t ) B_{i,k}(t) Bi,k(t) 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1上也是非负的。通过数学归纳法,我们就可以证明所有的伯恩斯坦多项式在 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1上是非负的。

伯恩斯坦多项式拥有单位剖分性

如果一组函数,当自变量取值为 t t t时相加等于1,则称该组函数具有单位剖分性。 k + 1 k+1 k+1 k k k次多项式具有单位剖分性质,因为他们相加等于1.

对于任意的 k k k k + 1 k+1 k+1 k k k次伯恩斯坦多项式的在 t t t处的和等于 k k k k − 1 k-1 k1次伯恩斯坦多项式的在 t t t处的和,即
∑ i = 0 k B i , k ( t ) = ∑ i = 0 k − 1 B i , k − 1 ( t ) \sum_{i=0}^k B_{i,k}(t) = \sum_{i=0}^{k-1} B_{i,k-1}(t) i=0kBi,k(t)=i=0k1Bi,k1(t)
单位划分的性质在几何建模和计算机图形学上非常的重要。特别的,对于三维空间中任何一组点 P 0 , P 1 , ⋯   , P n P_0,P_1,\cdots,P_n P0,P1,,Pn对于任意的 t t t,表达式
P ( t ) = P 0 B 0 , n ( t ) + P 1 B 1 , n ( t ) + ⋯ + P n B n , n ( t ) P(t)=P_0B_{0,n}(t)+P_1B_{1,n}(t)+\cdots+P_nB_{n,n}(t) P(t)=P0B0,n(t)+P1B1,n(t)++PnBn,n(t)
是这组点的仿射组合,且如果 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1则它是这组点的凸组合。

升阶

任意一个低阶的伯恩斯坦多项式(次数 < n <n <n)都可以表达成 n n n次伯恩斯坦多项式的线性组合。特别的, n − 1 n-1 n1次伯恩斯坦多项式可以写成 n n n次伯恩斯坦多项式的线性组合。首先我们注意到
t B i , n ( t ) = ( n i ) t i + 1 ( 1 − t ) n − i = ( n i ) t i + 1 ( 1 − t ) ( n + 1 ) − ( i + 1 ) = ( n i ) ( n + 1 i + i ) B i + 1 , n + 1 ( t ) = i + 1 n + 1 B i + 1 , n + 1 ( t ) \begin{aligned} t B_{i, n}(t) &=\left(\begin{array}{c} n \\ i \end{array}\right) t^{i+1}(1-t)^{n-i} \\ &=\left(\begin{array}{c} n \\ i \end{array}\right) t^{i+1}(1-t)^{(n+1)-(i+1)} \\ &=\frac{\left(\begin{array}{c} n \\ i \end{array}\right)}{\left(\begin{array}{c} n+1 \\ i+i \end{array}\right)} B_{i+1, n+1}(t) \\ &=\frac{i+1}{n+1} B_{i+1, n+1}(t) \end{aligned} tBi,n(t)=(ni)ti+1(1t)ni=(ni)ti+1(1t)(n+1)(i+1)=(n+1i+i)(ni)Bi+1,n+1(t)=n+1i+1Bi+1,n+1(t)

( 1 − t ) B i , n ( t ) = ( n i ) t i ( 1 − t ) n + 1 − i = ( n i ) ( n + 1 i ) B i , n + 1 ( t ) = n − i + 1 n + 1 B i , n + 1 ( t ) \begin{aligned} (1-t) B_{i, n}(t) &=\left(\begin{array}{c} n \\ i \end{array}\right) t^{i}(1-t)^{n+1-i} \\ &=\frac{\left(\begin{array}{c} n \\ i \end{array}\right)}{\left(\begin{array}{c} n+1 \\ i \end{array}\right)} B_{i, n+1}(t) \\ &=\frac{n-i+1}{n+1} B_{i, n+1}(t) \end{aligned} (1t)Bi,n(t)=(ni)ti(1t)n+1i=(n+1i)(ni)Bi,n+1(t)=n+1ni+1Bi,n+1(t)
最后
1 ( n i ) B i , n ( t ) + 1 ( n i + 1 ) B i + 1 , n ( t ) = t i ( 1 − t ) n − i + t i + 1 ( 1 − t ) n − ( i + 1 ) = t i ( 1 − t ) n − i − 1 ( ( 1 − t ) + t ) = t i ( 1 − t ) n − i − 1 = 1 ( n − 1 i ) B i , n − 1 ( t ) \begin{aligned} \frac{1}{\left(\begin{array}{c} n \\ i \end{array}\right)} B_{i, n}(t)+\frac{1}{\left(\begin{array}{c} n \\ i+1 \end{array}\right)} B_{i+1, n}(t) &=t^{i}(1-t)^{n-i}+t^{i+1}(1-t)^{n-(i+1)} \\ &=t^{i}(1-t)^{n-i-1}((1-t)+t) \\ &=t^{i}(1-t)^{n-i-1} \\ &=\frac{1}{\left(\begin{array}{c} n-1 \\ i \end{array}\right)} B_{i, n-1}(t) \end{aligned} (ni)1Bi,n(t)+(ni+1)1Bi+1,n(t)=ti(1t)ni+ti+1(1t)n(i+1)=ti(1t)ni1((1t)+t)=ti(1t)ni1=(n1i)1Bi,n1(t)
使用最后这个公式,我们就可以根据高阶的伯恩斯坦多项式写出任意的伯恩斯坦多项式,即
B i , n − 1 ( t ) = ( n − 1 i ) [ 1 ( n i ) B i , n ( t ) + 1 ( n i + 1 ) B i + 1 , n ( t ) ] = ( n − i n ) B i , n ( t ) + ( i + 1 n ) B i + 1 , n ( t ) \begin{aligned} B_{i, n-1}(t) &=\left(\begin{array}{c} n-1 \\ i \end{array}\right)\left[\frac{1}{\left(\begin{array}{c} n \\ i \end{array}\right)} B_{i, n}(t)+\frac{1}{\left(\begin{array}{c} n \\ i+1 \end{array}\right)} B_{i+1, n}(t)\right] \\ &=\left(\frac{n-i}{n}\right) B_{i, n}(t)+\left(\frac{i+1}{n}\right) B_{i+1, n}(t) \end{aligned} Bi,n1(t)=(n1i)(ni)1Bi,n(t)+(ni+1)1Bi+1,n(t)=(nni)Bi,n(t)+(ni+1)Bi+1,n(t)
这说明了 n − 1 n-1 n1次的伯恩斯坦多项式可以有 n n n次的伯恩斯坦多项式线性组合表示。于是我们可以说任何 k k k次(小于 n n n)的伯恩斯坦多项式都可以写成 n n n次伯恩斯坦多项式的线性组合。例如, n − 2 n−2 n2次的伯恩斯坦多项式可以表示为两个 n − 1 n−1 n1次伯恩斯坦多项式的线性组合,而每个 n − 1 n-1 n1次的伯恩斯坦多项式,又可以表示为两个 n n n次伯恩斯坦多项式的线性组合,依此类推。

伯恩斯坦多项式基与幂基的转换

由于幂基 { 1 , t , t 2 , ⋯   , t n } \{1,t,t^2,\cdots,t^n\} {1,t,t2,,tn}构成了次数小于或等于 n n n的多项式空间的基,所以任何一个 n n n次伯恩斯坦多项式都可以用幂基表示。我们可以通过伯恩斯坦多项式的定义和二项式定理得到
B k , n ( t ) = ( n k ) t k ( 1 − t ) n − k = ( n k ) t k ∑ i = 0 n − k ( − 1 ) i ( n − k i ) t i = ∑ i = 0 n − k ( − 1 ) i ( n k ) ( n − k i ) t i + k = ∑ i = k n ( − 1 ) i − k ( n k ) ( n − k i − k ) t i = ∑ i = k n ( − 1 ) i − k ( n i ) ( i k ) t i \begin{aligned} B_{k, n}(t) &=\left(\begin{array}{l} n \\ k \end{array}\right) t^{k}(1-t)^{n-k} \\ &=\left(\begin{array}{l} n \\ k \end{array}\right) t^{k} \sum_{i=0}^{n-k}(-1)^{i}\left(\begin{array}{c} n-k \\ i \end{array}\right) t^{i} \\ &=\sum_{i=0}^{n-k}(-1)^{i}\left(\begin{array}{l} n \\ k \end{array}\right)\left(\begin{array}{c} n-k \\ i \end{array}\right) t^{i+k} \\ &=\sum_{i=k}^{n}(-1)^{i-k}\left(\begin{array}{c} n \\ k \end{array}\right)\left(\begin{array}{c} n-k \\ i-k \end{array}\right) t^{i} \\ &=\sum_{i=k}^{n}(-1)^{i-k}\left(\begin{array}{c} n \\ i \end{array}\right)\left(\begin{array}{l} i \\ k \end{array}\right) t^{i} \end{aligned} Bk,n(t)=(nk)tk(1t)nk=(nk)tki=0nk(1)i(nki)ti=i=0nk(1)i(nk)(nki)ti+k=i=kn(1)ik(nk)(nkik)ti=i=kn(1)ik(ni)(ik)ti
其中,我们使用了二项式定理对 ( 1 − t ) n − k (1-t)^{n-k} (1t)nk进行展开。

对于幂基转换成伯恩斯坦基,我们可以使用升阶公式
t k = t ( t k − 1 ) = t ∑ i = k − 1 n ( i k − 1 ) ( n k − 1 ) B i , n − 1 ( t ) = ∑ i = k n ( i − 1 k − 1 ) ( n − 1 k − 1 ) t B i − 1 , n − 1 ( t ) = ∑ i = k − 1 n − 1 ( i k − 1 ) ( n k − 1 ) i n B i , n ( t ) = ∑ i = k − 1 n − 1 ( i k ) ( n k ) B i , n ( t ) \begin{aligned} t^{k} &=t\left(t^{k-1}\right) \\ &=t \sum_{i=k-1}^{n} \frac{\left(\begin{array}{c} i \\ k-1 \end{array}\right)}{\left(\begin{array}{l} n \\ k-1 \end{array}\right)} B_{i, n-1}(t) \\ &=\sum_{i=k}^{n} \frac{\left(\begin{array}{c} i-1 \\ k-1 \end{array}\right)}{\left(\begin{array}{c} n-1 \\ k-1 \end{array}\right)} t B_{i-1, n-1}(t) \\ &=\sum_{i=k-1}^{n-1} \frac{\left(\begin{array}{c} i \\ k-1 \end{array}\right)}{\left(\begin{array}{c} n \\ k-1 \end{array}\right)} \frac{i}{n} B_{i, n}(t) \\ &=\sum_{i=k-1}^{n-1} \frac{\left(\begin{array}{l} i \\ k \end{array}\right)}{\left(\begin{array}{c} n \\ k \end{array}\right)} B_{i, n}(t) \end{aligned} tk=t(tk1)=ti=k1n(nk1)(ik1)Bi,n1(t)=i=kn(n1k1)(i1k1)tBi1,n1(t)=i=k1n1(nk1)(ik1)niBi,n(t)=i=k1n1(nk)(ik)Bi,n(t)
在第二步中我们使用了归纳假设。

伯恩斯坦多项式的矩阵表达

在许多应用场景中,使用矩阵形式的伯恩斯坦多项式是方便的。我们写出一个由伯恩斯坦基函数线性组合得到的多项式
B ( t ) = c 0 B 0 , n ( t ) + c 1 B 1 , n ( t ) + ⋯ + c n B n , n ( t ) B(t)=c_0B_{0,n}(t)+c_1B_{1,n}(t)+\cdots+c_nB_{n,n}(t) B(t)=c0B0,n(t)+c1B1,n(t)++cnBn,n(t)
我们很容易的将上式写成两个向量点乘的形式
B ( t ) = [ B 0 , n ( t ) B 1 , n ( t ) ⋯ B n , n ( t ) ] [ c 0 c 1 ⋮ c n ] B(t)=\left[\begin{array}{llll} B_{0, n}(t) & B_{1, n}(t) & \cdots & B_{n, n}(t) \end{array}\right]\left[\begin{array}{c} c_{0} \\ c_{1} \\ \vdots \\ c_{n} \end{array}\right] B(t)=[B0,n(t)B1,n(t)Bn,n(t)]c0c1cn
进一步,可以写出
B ( t ) = [ 1 t t 2 ⋯ t n ] [ b 0 , 0 0 0 ⋯ 0 b 1 , 0 b 1 , 1 0 ⋯ 0 b 2 , 0 b 2 , 1 b 2 , 2 ⋯ 0 ⋮ ⋮ ⋮ ⋱ ⋮ b n , 0 b n , 1 b n , 2 ⋯ b n , n ] [ c 0 c 1 c 2 ⋮ c n ] B(t)=\left[\begin{array}{llll} 1 & t & t^2 & \cdots & t^n \end{array}\right] \left[\begin{array}{c} b_{0,0} & 0 & 0 & \cdots & 0 \\ b_{1,0} & b_{1,1} & 0 & \cdots & 0 \\ b_{2,0} & b_{2,1} & b_{2,2} & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ b_{n,0} & b_{n,1} & b_{n,2} & \cdots & b_{n,n} \end{array}\right] \left[\begin{array}{c} c_{0} \\ c_{1} \\ c_{2} \\ \vdots \\ c_{n} \end{array}\right] B(t)=[1tt2tn]b0,0b1,0b2,0bn,00b1,1b2,1bn,100b2,2bn,2000bn,nc0c1c2cn
其中 b i , j b_{i,j} bi,j是用于确定相应伯恩斯坦多项式的幂基系数。可以看出,该矩阵是一个下三角矩阵。

对于二次多项式( n = 2 n=2 n=2)的情况,矩阵表示为
B ( t ) = [ 1 t t 2 ] [ 1 0 0 − 2 2 0 1 − 2 0 ] [ c 0 c 1 c 2 ] B(t)=\left[\begin{array}{llll} 1 & t & t^2 \end{array}\right] \left[\begin{array}{c} 1 & 0 & 0 \\ -2 & 2 & 0 \\ 1 & -2 & 0 \\ \end{array}\right] \left[\begin{array}{c} c_{0} \\ c_{1} \\ c_{2} \end{array}\right] B(t)=[1tt2]121022000c0c1c2
对于三次( n = 3 n=3 n=3)的情况,矩阵表示为
B ( t ) = [ 1 t t 2 t 3 ] [ 1 0 0 0 − 3 3 0 0 3 − 6 3 0 − 1 3 − 3 1 ] [ c 0 c 1 c 2 c 3 ] B(t)=\left[\begin{array}{llll} 1 & t & t^2 & t^3 \end{array}\right] \left[\begin{array}{c} 1 & 0 & 0 & 0 \\ -3 & 3 & 0 & 0 \\ 3 & -6 & 3 & 0 \\ -1 & 3 & -3 & 1 \\ \end{array}\right] \left[\begin{array}{c} c_{0} \\ c_{1} \\ c_{2} \\ c_{3} \end{array}\right] B(t)=[1tt2t3]1331036300330001c0c1c2c3

  • 22
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
伯恩斯坦曲线(Bézier Curve)是一种常用于计算机图形学中的曲线,可以用来描述平滑的曲线。OpenGL提供了一个名为“glMap1”的函数,可以用来绘制伯恩斯坦曲线。下面是一个简单的例子: ``` // 控制点数组 GLfloat ctrlpoints[4][3] = { {-4.0, -4.0, 0.0}, {-2.0, 4.0, 0.0}, {2.0, -4.0, 0.0}, {4.0, 4.0, 0.0} }; void display() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); // 开启映射 glEnable(GL_MAP1_VERTEX_3); glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]); // 绘制曲线 glBegin(GL_LINE_STRIP); for (int i = 0; i <= 30; i++) { glEvalCoord1f((GLfloat) i / 30.0); } glEnd(); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 400); glutCreateWindow("Bezier Curve Example"); glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-5.0, 5.0, -5.0, 5.0); glMatrixMode(GL_MODELVIEW); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 这个例子绘制了一个四次伯恩斯坦曲线,控制点数组中包含了四个三维点。在`display`函数中,我们先开启了`GL_MAP1_VERTEX_3`映射,并将控制点数组传递给OpenGL。然后我们使用`glBegin(GL_LINE_STRIP)`函数开始绘制线段,使用`glEvalCoord1f`函数对曲线进行采样,并在循环中逐个绘制采样点。最后使用`glEnd`函数结束绘制。 你可以根据自己的需要修改控制点数组,绘制不同的伯恩斯坦曲线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值