使用OpenGL语句来绘制3次B样条曲线与Bezier曲线,并进行对比
时间: 2023-05-19 19:01:38 浏览: 187
可以使用以下OpenGL语句来绘制3次B样条曲线和Bezier曲线:
// 绘制3次B样条曲线
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord1f((GLfloat) i/30.0);
glEnd();
// 绘制Bezier曲线
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord1f((GLfloat) i/30.0);
glEnd();
其中,ctrlpoints是一个4x3的数组,存储了B样条曲线的控制点坐标。绘制Bezier曲线时,可以直接使用控制点坐标。对比两种曲线,可以发现B样条曲线更加平滑,而Bezier曲线则更加自然。
相关问题
使用python绘制Bezier曲线、B样条曲线和NURBS曲线
要绘制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()
```
阅读全文