[摘抄] Bezier曲线、B样条和NURBS

  Bezier曲线、B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是:

  • Bezier曲线中的每个控制点都会影响整个曲线的形状,而B样条中的控制点只会影响整个曲线的一部分,显然B样条提供了更多的灵活性;
  • Bezier和B样条都是多项式参数曲线,不能表示一些基本的曲线,比如圆,所以引入了NURBS,即非均匀有理B样条来解决这个问题;

  Bezier曲线只是B样条的一个特例而已,而B样条又是NURBS的一个特例,它们的关系可以图示为: 

   

  B样条克服了Bezier曲线的一些缺点,Bezier曲线的每个控制点对整条曲线都有影响,也就是说,改变一个控制点的位置,整条曲线的形状都会发生变化,而B样条中的每个控制点只会影响曲线的一段参数范围,从而实现了局部修改。

   Bezier曲面、B样条曲面和NURBS曲面

参考文献:

 Bezier、B样条曲线曲面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要绘制Bezier曲线B样条曲线NURBS曲线,我们可以使用Python的matplotlib库和numpy库。 首先,我们需要导入这些库: ```python import matplotlib.pyplot as plt import numpy as np from scipy.interpolate import BSpline from geomdl import BSpline as NURBSpline from geomdl import utilities ``` 接下来,我们将定义一些控制点来绘制曲线。这些点将被用于Bezier曲线B样条曲线NURBS曲线的绘制。我们将使用以下控制点: ```python points = np.array([[1, 0], [2, 3], [4, 5], [7, 8], [9, 7]]) ``` 接下来,我们将绘制Bezier曲线。要绘制Bezier曲线,我们需要使用numpy库中的polyval函数。该函数使用控制点和参数t来计算Bezier曲线上的点。 ```python t = np.linspace(0, 1, 100) curve = np.zeros((len(t), 2)) for i in range(len(t)): curve[i] = np.polyval(np.flip(points.T, axis=1), t[i]) plt.plot(curve[:,0], curve[:,1], label='Bezier') ``` 我们使用np.flip(points.T, axis=1)将我们的点数组转换为numpy多项式系数数组。然后,我们将该数组传递给polyval函数,该函数返回Bezier曲线上的点。最后,我们使用matplotlib库的plot函数绘制Bezier曲线。 接下来,我们将绘制B样条曲线。要绘制B样条曲线,我们使用SciPy库中的BSpline函数。该函数需要控制点、阶数和节点序列作为输入。我们将使用阶数3,因为这是最常用的。节点序列是一组非降序列,通常是均匀分布的,因此我们将使用numpy库中的linspace函数来生成节点序列。 ```python t = np.linspace(0, 1, 100) k = 3 tck, u = splprep(points.T, k=k) curve = splev(t, tck) plt.plot(curve[0], curve[1], label='B-spline') ``` 我们使用splprep函数来计算B样条曲线的参数。该函数返回一个元组,其中包含控制点、节点序列和阶数。然后,我们使用splev函数计算B样条曲线上的点。最后,我们再次使用matplotlib库的plot函数绘制B样条曲线。 最后,我们将绘制NURBS曲线。要绘制NURBS曲线,我们需要使用GeomDL库。该库提供了一个BSpline类,该类可以用于计算NURBS曲线。 ```python degree = 3 knots = utilities.generate_knot_vector(degree, len(points)) nurbs = NURBSpline.Curve() nurbs.degree = degree nurbs.ctrlpts = points.tolist() nurbs.knotvector = knots t = np.linspace(0, 1, 100) curve = nurbs.evaluate_list(t) plt.plot([pt[0] for pt in curve], [pt[1] for pt in curve], label='NURBS') ``` 我们首先使用generate_knot_vector函数生成节点序列。然后,我们创建一个NURBSpline.Curve对象,并将控制点、节点序列和阶数设置为对象的属性。最后,我们使用evaluate_list函数计算NURBS曲线上的点。最后,我们再次使用matplotlib库的plot函数绘制NURBS曲线。 完整代码如下所示: ```python import matplotlib.pyplot as plt import numpy as np from scipy.interpolate import splprep, splev from geomdl import BSpline as NURBSpline from geomdl import utilities points = np.array([[1, 0], [2, 3], [4, 5], [7, 8], [9, 7]]) # Bezier curve t = np.linspace(0, 1, 100) curve = np.zeros((len(t), 2)) for i in range(len(t)): curve[i] = np.polyval(np.flip(points.T, axis=1), t[i]) plt.plot(curve[:,0], curve[:,1], label='Bezier') # B-spline curve t = np.linspace(0, 1, 100) k = 3 tck, u = splprep(points.T, k=k) curve = splev(t, tck) plt.plot(curve[0], curve[1], label='B-spline') # NURBS curve degree = 3 knots = utilities.generate_knot_vector(degree, len(points)) nurbs = NURBSpline.Curve() nurbs.degree = degree nurbs.ctrlpts = points.tolist() nurbs.knotvector = knots t = np.linspace(0, 1, 100) curve = nurbs.evaluate_list(t) plt.plot([pt[0] for pt in curve], [pt[1] for pt in curve], label='NURBS') plt.legend() plt.show() ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值