pygame飞机大战用精灵组层编写敌机系列(三)B样条曲线的实现方式介绍

用贝塞尔曲线,固然能实现各种运动轨迹,可因为曲线不是经过设定的点的,需要进行调试才知道最终的轨迹。看了很多曲线公式,貌似B样条曲线比较适合粗的曲线运动轨迹。

但是B样条曲线计算公式更为复杂,就偷懒用了功能强大的几个库。

 NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组。它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在原生Python中永远无法体验到的速度。

scipy  包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,统计,特殊函数等等。

matplotlib 演示用,可以输出图形。

先建立测试程序,用来测试B样条曲线的效果。

运行之前,先pip install numpy,pip install scipy,pip install matplotlib

建立一个demo.py

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
points = [(3.28,0.00),(4.00,0.50),(4.40,1.0),(4.60,1.52),(5.00,2.5),(5.00,3.34),(4.70,3.8)]
points = points + [(4.50,3.96),(4.20,4.0),(3.70,3.90),(3.00,3.5),(2.00,2.9)]

data = np.array(points)

tck,u = interpolate.splprep(data.transpose(), s=0)
unew = np.arange(0, 1.01, 0.01)

out = interpolate.splev(unew, tck)


plt.plot(out[0], out[1], color='orange')

plt.plot(data[:,0], data[:,1], 'ob')
plt.show()

运行一下,效果如下

pygame飞机大战用精灵组层编写敌机系列(三)B样条曲线的实现方式介绍_第1张图片

可以看到,短短的几行,就实现了连接各点的样条曲线,虽然没有贝塞尔来得好看,可贵在轨迹定义简单。

points就是你想要控制的轨迹点,out就是运算后的轨迹点。

你可能感兴趣的:(python,pygame)