贝塞尔曲线

基本公式:B(t)=∑i=0n(in)Pi(1−t)n−iti,t∈[0,1]基本公式:B(t)=\sum_{i=0}^{n} \Big({_i^n}\Big)P_i(1-t)^{n-i}t^i,t\in[0,1]基本公式:B(t)=i=0∑n​(in​)Pi​(1−t)n−iti,t∈[0,1]
三次贝塞尔曲线:
B(t)=P0(1−t)3+3P1t(1−t)2+3P2t2(1−t)+P3t3,t∈[0,1]B(t)=P_0(1-t)^3+3P_1t(1-t)^2+3P_2t^2(1-t)+P_3t^3,t\in[0,1]B(t)=P0​(1−t)3+3P1​t(1−t)2+3P2​t2(1−t)+P3​t3,t∈[0,1]
由此可见其系数规律:
111\ 11 11211\ 2\ 11 2 113311\ 3\ 3\ 11 3 3 1146411\ 4\ 6\ 4\ 11 4 6 4 1
分别为一阶到四阶的系数规律,变化规律为杨辉三角,并且ttt与(t−1)(t-1)(t−1)的规律是一个逐渐转变的一个过程。

一段贝塞尔曲线拟合程序:

import matplotlib.pyplot as pltx = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [12, 2, 78, 12, 34, 23, 67, 87, 98, 10]
xnew = []
ynew = []def Bazier_3(m1, m2):for i in range(101):t = i / 100xnew.append(m1[0] * (1 - t) ** 3 + 3 * m1[1] * t * (1 - t) ** 2 + 3 * m1[2] * t ** 2 * (1 - t) + m1[3] * t ** 3)ynew.append(m2[0] * (1 - t) ** 3 + 3 * m2[1] * t * (1 - t) ** 2 + 3 * m2[2] * t ** 2 * (1 - t) + m2[3] * t ** 3)for i in range(len(x) // 3):Bazier_3(x[i * 3:(i + 1) * 3 + 1], y[i * 3:(i + 1) * 3 + 1])plt.plot(xnew, ynew)
plt.plot(x, y)
plt.scatter(x, y)
plt.show()

可以看到 ,在3,6这两个点,并不满族c2连续。

B样条曲线

基本公式:P⃗(t)=∑i=0nPi⃗Bi,n(t)基本公式:\vec{P}(t)=\sum_{i=0}^{n}\vec{P_{i}}B_{i,n}(t)基本公式:P(t)=i=0∑n​Pi​​Bi,n​(t)

其基本形式与贝塞尔曲线相似

其中T=[t0,t1,t2,...,tn]其中T=[t_{0},t_{1},t_{2},...,t_{n}]其中T=[t0​,t1​,t2​,...,tn​]

Ni,0(t)={1t>ti或t≥ti+10ti≤t≤ti+1N_{i,0}(t)=\Big \{ ^{0\qquad\qquad t_{i}{\le}t{\le}t_{i+1}}_{1\qquad\qquad t>t_{i}或t{\ge}t_{i+1}}Ni,0​(t)={1t>ti​或t≥ti+1​0ti​≤t≤ti+1​​

Ni,k(t)=t−titi+k−tiNi,k−1(t)+ti+k+1−tti+k+1−ti+nNi+1,k−1(t)k≥1N_{i,k}(t)=\frac{t-t_i}{t_{i+k}-t_i}N_{i,k-1}(t)+\frac{t_{i+k+1}-t}{t_{i+k+1}-t_{i+n}}N_{i+1,k-1}(t)\qquad k\ge1Ni,k​(t)=ti+k​−ti​t−ti​​Ni,k−1​(t)+ti+k+1​−ti+n​ti+k+1​−t​Ni+1,k−1​(t)k≥1
其中,Ni,k(t)中的i是控制点,k是次数其中,N_{i,k}(t)中的i是控制点,k是次数 其中,Ni,k​(t)中的i是控制点,k是次数
用的最多的是三次B样条曲线。
其中:
N0,3(t)=16(−t3+3t2−3t+1)N_{0,3}(t)=\frac{1}{6}(-t^3+3t^2-3t+1)N0,3​(t)=61​(−t3+3t2−3t+1)

N1,3(t)=16(3t3−6t2+4)N_{1,3}(t)=\frac{1}{6}(3t^3-6t^2+4)N1,3​(t)=61​(3t3−6t2+4)

N2,3(t)=16(−3t3−3t2+3t+1)N_{2,3}(t)=\frac{1}{6}(-3t^3-3t^2+3t+1)N2,3​(t)=61​(−3t3−3t2+3t+1)

N1,3(t)=16t3N_{1,3}(t)=\frac{1}{6}t^3N1,3​(t)=61​t3

为了使其闭合,要取最后一个点与与第一个控制点相同,即Pm+1=P0P_{m+1}=P_0Pm+1​=P0​,Pm+2=P1P_{m+2}=P_1Pm+2​=P1​,Pm+3=P2P_{m+3}=P_2Pm+3​=P2​,这样的曲线满足c2c_2c2​连续。

一个拼接示例:

import matplotlib.pyplot as pltx = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [12, 2, 78, 12, 34, 23, 67, 87, 98, 10]
xnew = []
ynew = []arg = [[-1, 3, -3, 1], [3, -6, 0, 4], [-3, 3, 3, 1], [1, 0, 0, 0]]def Ba(t, coefficient):return (coefficient[0] * t ** 3 + coefficient[1] * t ** 2 + coefficient[2] * t + coefficient[3]) / 6def creat(n):for i in range(101):t = i / 100xnew.append(x[n + 0] * Ba(t, arg[0]) + x[n + 1] * Ba(t, arg[1]) + x[n + 2] * Ba(t, arg[2]) + x[n + 3] * Ba(t, arg[3]))ynew.append(y[n + 0] * Ba(t, arg[0]) + y[n + 1] * Ba(t, arg[1]) + y[n + 2] * Ba(t, arg[2]) + y[n + 3] * Ba(t, arg[3]))for i in range(7):creat(i)plt.plot(xnew, ynew)
plt.plot(x, y)
plt.scatter(x, y)
plt.show()

拼接后的图片如下所示,满足c2c_2c2​连续。

贝塞尔曲线与B样条曲线的结合:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3Darg = [[-1, 3, -3, 1], [3, -6, 0, 4], [-3, 3, 3, 1], [1, 0, 0, 0]]  # B样条曲线的拟合参数
mar = [[0, -93.70105743, -7.71050644, 11.30164337],[0, -81.51637268, 2.65858841, 21.85936928],[0, -100.43165588, -506.84307861, -277.47509766],[0, -413.89691162, -244.77906799, -228.4907074],[0, -74.61241913, 22.23334312, 28.80702591],[0, -57.65986252, 33.13808441, 40.01465988],[0, -23.39715576, -46.36453247, -68.40002441],[0, -427.99655151, -242.35075378, -246.75854492],[0, -93.70105743, -7.71050644, 11.30164337]]  # 原数据def Bazier_3(m1, m2):  # 贝塞尔曲线拟合x = []y = []for i in range(101):t = i / 100x.append(m1[0] * (1 - t) ** 3 + 3 * m1[1] * t * (1 - t) ** 2 + 3 * m1[2] * t ** 2 * (1 - t) + m1[3] * t ** 3)y.append(m2[0] * (1 - t) ** 3 + 3 * m2[1] * t * (1 - t) ** 2 + 3 * m2[2] * t ** 2 * (1 - t) + m2[3] * t ** 3)return x, ydef Ba(t, coefficient):  # 参数合成return (coefficient[0] * t ** 3 + coefficient[1] * t ** 2 + coefficient[2] * t + coefficient[3]) / 6def creat_mart(mart):  # 贝塞尔曲线生成re = []for i in range(len(mart)):temp_x, temp_y = Bazier_3([0, 1, 2, 3], mart[i])re.append(temp_y)return re, temp_xdef creat_mart_finnally(data):  # 最终生成out = []times = data.shape[0]for j in range(times - 1):for i in range(45):t = i / 45temp = 0for k in range(4):temp += data[(j + k) % times] * Ba(t, arg[k])out.append(temp)return outdef draw(mat1, mat2, mat3):x = np.linspace(0, 8, 9)y = np.linspace(0, 3, 4)x, y = np.meshgrid(x, y)x = x.Ty = y.Txs = np.ravel(x)ys = np.ravel(y)zs = np.ravel(mat1)xnew = np.linspace(0, 8, 360)ynew = np.linspace(0, 3, 101)xn, yn = np.meshgrid(xnew, ynew)x_min = np.linspace(0, 8, 9)y_min = np.linspace(0, 3, 101)x_min, y_min = np.meshgrid(x_min, y_min)plt.figure("原数据")ax = plt.subplot(1, 1, 1, projection='3d')ax.plot_trisurf(xs, ys, zs, cmap='coolwarm')ax.set_xlabel('angle')ax.set_ylabel('stepsize')ax.set_zlabel('Z')plt.title('raw')plt.figure("最终数据")ax2 = plt.subplot(1, 1, 1, projection='3d')ax2.plot_surface(xn.T, yn.T, mat2, rstride=2, cstride=2, cmap='coolwarm', linewidth=0.5, antialiased=True)ax2.set_xlabel('angle')ax2.set_ylabel('stepsize')ax2.set_zlabel('Z')plt.title('processed')plt.figure("中间数据")ax3 = plt.subplot(1, 1, 1, projection='3d')ax3.plot_surface(x_min.T, y_min.T, mat3, rstride=2, cstride=2, cmap='coolwarm', linewidth=0.5, antialiased=True)ax3.set_xlabel('angle')ax3.set_ylabel('stepsize')ax3.set_zlabel('Z')plt.title('min')plt.show()mat_new, _ = creat_mart(mar)mat_new = np.array(mat_new)mat_f = []
for i in range(mat_new.shape[1]):mat_f.append(creat_mart_finnally(mat_new[:, i]))mat_f = np.array(mat_f).Tdraw(np.array(mar), mat_f, mat_new)

生成的图片如下:
源数据:

在步长方向上进行了贝塞尔曲线插值之后的数据是这样的:

在角度方向上面进行了B样条曲线插值:

B样条曲线与贝塞尔曲线学习笔记相关推荐

  1. 咸鱼菌玩3D—样条曲线和贝塞尔曲线

    咸鱼菌玩3D-样条曲线和贝塞尔曲线 多线段 样条曲线 贝塞尔曲线 123D提供了 多段线和 样条曲线两种自由绘制工具,而后者比前者更加灵活自由,能够绘制更复杂的形状. 在设计领域中有一种被称作 贝塞尔 ...

  2. 贝塞尔曲线学习【1】

    贝塞尔曲线学习[1] 今天学习了贝塞尔曲线的相关内容 特别感谢 http://blog.csdn.net/z82367825/article/details/51599245 博文. 具体的理论知识就 ...

  3. java贝塞尔曲线_贝塞尔曲线学习

    贝塞尔曲线学习 1.贝塞尔曲线 以下公式中: B(t)为t时间下 点的坐标: P0为起点,Pn为终点,Pi为控制点 一阶贝塞尔曲线(线段): 一阶贝塞尔曲线公式 一阶贝塞尔曲线演示 意义:由 P0 至 ...

  4. 贝塞尔曲线学习:正弦曲线

    前言内容 以前通过自定义view可以绘制出各种效果,但这些效果多数还是存在于规则的图像,今天学习贝塞尔曲线,来绘制一些更特别的线条. 简单来说贝塞尔曲线通过控制点,可以绘制出各种路径.一般我们常用的二 ...

  5. Reeds-Shepp曲线学习笔记及相关思考

       本篇博客主要记录在学习Reeds-Shepp曲线过程中的笔记及相关思考和概括总结 一.主要参考资料      1.提出Reeds-Shepp曲线的原始论文:[点击此处跳转]      2.路径规 ...

  6. Dubins曲线学习笔记及相关思考

       本篇博客主要记录在学习Dubins曲线过程中的笔记及相关思考和概括总结 一.主要参考资料      1.Andy G's Blog:[点击此处跳转]      2.Andy G's Blog的P ...

  7. 三阶贝塞尔曲线选点_用三阶贝塞尔曲线拟合圆

    前言 由于贝塞尔曲线控制简便且具有极强的描述能力,它常被用来生成复杂的平滑曲线:圆形是一种很常用的普通图形,在计算机图形学中也有很多画圆的算法,本文想探究一下如何用三阶贝塞尔曲线拟合圆形. 在研究这个 ...

  8. 贝塞尔曲线,B-样条,非均匀有理B样条梳理

    文章目录 1. 贝塞尔曲线(Bézier curve) 1.1 一阶贝塞尔曲线 1.2 二阶贝塞尔曲线.高阶贝塞尔曲线 1.3 贝塞尔曲线的一般形式 1.4 贝塞尔曲线的性质 1.5 贝塞尔曲线在运动 ...

  9. android高级UI之贝塞尔曲线<上>---基本概念、德卡斯特里奥算法

    在上一次android高级UI之Canvas综合案例操练 - cexo - 博客园对于Android UI绘制中核心的Canvas进行了相关的学习,这块的学习也中断一年多了,既然主业是Android开 ...

  10. 学习笔记:贝塞尔曲线法

    一.算法简介 1.贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计. 2.贝塞尔曲线是应用于二维图形应用程序的数学曲线, ...

最新文章

  1. 哈工大百年校庆!为国防航天而生,高文王海峰刘挺等AI大牛都是校友
  2. 从硬件角度看,无人车商业化落地难点
  3. SSIS - 5.优先约束
  4. 电动力学每日一题 2021/10/14
  5. 程序员财富自由了,居然会想做这些事!
  6. java web 测试类,构建一个容易单元测试的java–web系统-JSP教程,Java技巧及代码
  7. 数据结构课上笔记14
  8. c++opencv显示中文_图像处理入门 100 题,有人把它翻译成了中文版!
  9. android netty导入_Netty在Android中使用
  10. Vue.js 2.0 参考手册.CHM下载
  11. python template languages_更换Django默认的模板引擎为jinja2的实现方法
  12. 管理感悟:轮值不是记流水账
  13. Julia : 数组(矩阵)的条件过滤
  14. 会声会影制作转场特效及视频转场的应用
  15. linux用sed替换字符,Linux中使用sed命令替换字符串小结
  16. 头歌-自己动手画CPU(第一关)-8位可控加减法器-Logisim
  17. BZOJ3772:精神污染
  18. 一米村长讲故事机器人_村长讲故事
  19. java面试(JVM)
  20. 采购工作内容是什么?如何成为一名优秀的采购?

热门文章

  1. iic协议 c语言,IIC协议-C语言
  2. AS-实践《第一行代码》中的出现的问题
  3. 阿里巴巴Java开发手册(原文地址)
  4. WES7创建系统恢复盘
  5. tableau如何生成HTML文件,Tableau 入门
  6. 计算机考研培训中公,计算机408
  7. 被奉为经典的「金字塔原理」,教给我们哪些PPT写作技巧?
  8. livereload浏览器自动刷新
  9. 苹果cms去掉html,苹果cmsV10 隐藏显示视频设置教程
  10. 洛谷 P3496 [POI2010]GIL-Guilds 题解