B样条曲线的插值python代码

由于毕业设计的需要,生成的刀位点,个人觉得间隔有点大,为了能够以后用于实际加工,因此花了一上午的时间稍微了解了一下B样条曲线,废话不多说,直接上代码

import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from math import pow

f = open('data.txt')
x=[]
y=[]
z=[]
while True:
    m = f.readline().split()
    if len(m)==0:
        break
    data = [float(i) for i in m ]
    x.append(data[0])
    y.append(data[1])
    z.append(data[2])
fig = plt.figure()
ax = fig.gca(projection='3d')
x = []
Py = []
Pz = []
for i in range(1,len(x)-4):
    for t in [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
        Px.append((pow(1-t,3)*x[i]+(3*pow(t,3)-6*pow(t,2)+4)*x[i+1]+(-3*pow(t,3)+3*pow(t,2)+3*t+1)*x[i+2]+pow(t,3)*x[i+3])/6)
        Py.append((pow(1-t,3)*y[i]+(3*pow(t,3)-6*pow(t,2)+4)*y[i+1]+(-3*pow(t,3)+3*pow(t,2)+3*t+1)*y[i+2]+pow(t,3)*y[i+3])/6)
        Pz.append((pow(1-t,3)*z[i]+(3*pow(t,3)-6*pow(t,2)+4)*z[i+1]+(-3*pow(t,3)+3*pow(t,2)+3*t+1)*z[i+2]+pow(t,3)*z[i+3])/6)
x1 = x[:100]
y1 = y[:100]
z1 = z[:100]
Px1=Px[:1000]
Py1=Py[:1000]
Pz1=Pz[:1000]
ax.scatter(x1, y1, z1,c='r')
ax.scatter(Px1, Py1, Pz1,c='g')
plt.show()

代码前面的部分是读取和以列表的方式存储数据,插值部分在两个for循环里实现,可以自己修改变量 t 的步长达到更多的插值,Px、Py和Pz就是插值后的结果,至于为什么这样写,不解释。
同时使用了matplotlib进行绘制,这里参考了使用了这位的博客
matplotlib】绘制简单二维、三维图像
感兴趣的可以看看,相当于就是一个matlab绘图工具了
最后给大家展示一下结果
B样条曲线的插值python代码_第1张图片
B样条曲线的插值python代码_第2张图片

你可能感兴趣的:(本科毕业设计,python)