Bezier曲线与B-Spline曲线

news2024/10/6 1:38:08

贝塞尔曲线


一阶贝塞尔曲线 P 0 1 P_0^1 P01由两个控制点 P 0 P_0 P0 P 1 P_1 P1完全定义,相当于线性插值。随着 t t t从0到1变化,贝塞尔点从 P 0 P_0 P0移动到 P 1 P_1 P1.
P 0 1 = ( 1 − t ) P 0 + t P 1 , t ∈ [ 0 , 1 ] P_{0}^{1}=\left( 1-t\right) P_{0}+tP_{1}\quad,t\in[0,1] P01=(1t)P0+tP1,t[0,1]
在这里插入图片描述
二阶贝塞尔曲线由一阶贝塞尔曲线递归定义。三个控制点 P 0 P_0 P0 P 1 P_1 P1 P 2 P_2 P2,二阶贝塞尔曲线的产生完全由这三个点的位置决定。
三个控制点每两个相邻的控制点产生一个一阶贝塞尔点,两个一阶贝塞尔点,于是得到两个点;
两个点形成一个线段,这个线段上有一个点在运动,于是得到一个点;
P 1 1 = ( 1 − t ) P 1 + t P 2 P 0 2 = ( 1 − t ) P 0 1 + t P 1 1 = ( 1 − t ) [ ( 1 − t ) P 0 + t P 1 ] + t [ ( 1 − t ) P 1 + t P 2 ] = P 0 ( 1 − t ) 2 + 2 P 1 t ( 1 − t ) + P 2 t 2 \begin{aligned} P_{1}^{1}&=\left( 1-t\right) P_{1}+tP_{2}\\ P_{0}^{2}&=\left( 1-t\right) P_{0}^{1}+tP_{1}^{1}\\ &=\left( 1-t\right) \left[ \left( 1-t\right) P_{0}+tP_{1}\right] +t\left[ \left( 1-t\right) P_{1}+tP_{2}\right] \\ &=P_{0}\left( 1-t\right) ^{2}+2P_{1}t\left( 1-t\right) +P_{2}t^{2} \end{aligned} P11P02=(1t)P1+tP2=(1t)P01+tP11=(1t)[(1t)P0+tP1]+t[(1t)P1+tP2]=P0(1t)2+2P1t(1t)+P2t2
三阶贝塞尔曲线:
P 0 3 = P 0 ( 1 − t ) 3 + 3 P 1 t ( 1 − t ) + 3 P 2 t ( 1 − t ) + P 2 t 3 P_0^3=P_{0}\left( 1-t\right) ^{3}+3P_{1}t\left( 1-t\right) + 3P_{2}t\left( 1-t\right)+P_{2}t^{3} P03=P0(1t)3+3P1t(1t)+3P2t(1t)+P2t3
在这里插入图片描述
通用递归定义公式:

P i k = { P i k = 0 ( 1 − t ) P i k − 1 + t P i + 1 k − 1 k ⩾ 1 P_{i}^{k}=\begin{cases} P_i&k=0\\ \left( 1-t\right) P_{i}^{k-1}+tP_{i+1}^{k-1}&k\geqslant1 \end{cases} Pik={Pi(1t)Pik1+tPi+1k1k=0k1
总结规律可得n阶贝塞尔曲线的公式为:
P i n = ∑ j = 0 n C n j ( 1 − t ) n − j t j P i + j t ∈ [ 0 , 1 ] P_{i}^{n}=\sum ^{n}_{j=0}C_{n}^{j}\left( 1-t\right) ^{n-j}t^{j}P_{i+j}\quad t\in[0,1] Pin=j=0nCnj(1t)njtjPi+jt[0,1]
假设 n ⩽ k n\leqslant k nk时如下等式成立
P i k = ∑ j = 0 k C k j ( 1 − t ) k − j t j P i + j P_{i}^{k}=\sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j}t^{j}P_{i+j} Pik=j=0kCkj(1t)kjtjPi+j
n = k + 1 n=k+1 n=k+1时,
P i k + 1 = ( 1 − t ) P i k + t P i + 1 k . = ( 1 − t ) ∑ j = 0 k C k j ( 1 − t ) k − j t j P i + j + t ∑ j = 0 k C k j ( 1 − t ) k − j t j P i + j + 1 = ∑ j = 0 k C k j ( 1 − t ) k − j + 1 t j P i + j + ∑ j = 1 k + 1 C k j − 1 ( 1 − t ) k − j + 1 t j P i + j = ( 1 − t ) k + 1 + [ ∑ j = 1 k ( C k j + C k j − 1 ) ( 1 − t ) k − j + 1 t j P i + j ] + C k k t k + 1 \begin{aligned} P_{i}^{k+1}&=\left( 1-t\right) P_{i}^{k}+tP_{i+1}^{k}.\\ &=\left( 1-t\right) \sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j}t^{j}P_{i+j}+t\sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j}t^{j}P_{i+j+1}\\ &=\sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j+1}t^{j}P_{i+j}+\sum ^{k+1}_{j=1}C_{k}^{j-1}\left( 1-t\right) ^{k-j+1}t^{j}P_{i+j} \\ &=\left( 1-t\right) ^{k+1}+\left[ \sum ^{k}_{j=1}\left( C_{k}^{j}+C_{k}^{j-1}\right) \left( 1-t\right) ^{k-j+1}t^{j}P_{i+j}\right] +C_{k}^{k}t^{k+1} \end{aligned} Pik+1=(1t)Pik+tPi+1k.=(1t)j=0kCkj(1t)kjtjPi+j+tj=0kCkj(1t)kjtjPi+j+1=j=0kCkj(1t)kj+1tjPi+j+j=1k+1Ckj1(1t)kj+1tjPi+j=(1t)k+1+[j=1k(Ckj+Ckj1)(1t)kj+1tjPi+j]+Ckktk+1
因为
C k + 1 j = ( k + 1 ) ! ( k + 1 − j ) ! j ! C k j = k ! ( k − j ) ! j ! C k j − 1 = k ! ( k − j + 1 ) ! ( j − 1 ) ! C k j + C k j − 1 = k ! ( k − j ) ! ( j − 1 ) ! ( 1 j + 1 k − j + 1 ) = k ! ⋅ ( k + 1 ) [ ( k − j ) ! ⋅ ( k − j + 1 ) ] ⋅ [ ( j − 1 ) ! ⋅ j ] = ( k + 1 ) ! ( k + 1 − j ) ! j ! = C k + 1 j \begin{aligned} C_{k+1}^{j}&=\dfrac{\left( k+1\right) !}{\left( k+1-j\right) !j!}\\ C_{k}^{j}&=\dfrac{k!}{\left( k-j\right) !j!} \\ C_{k}^{j-1}&=\dfrac{k!}{\left( k-j+1\right) !\left( j-1\right) !} \\ C_{k}^{j}+C_{k}^{j-1}&=\dfrac{k!}{\left( k-j\right) !\left( j-1\right) !}\left( \dfrac{1}{j}+\dfrac{1}{k-j+1}\right) \\ &=\dfrac{k!\cdot \left( k+1\right) }{\left[ \left( k-j\right) !\cdot \left( k-j+1\right) \right] \cdot \left[ \left( j-1\right) !\cdot j\right] }\\ &=\dfrac{\left( k+1\right) !}{\left( k+1-j\right) !j!}=C_{k+1}^{j} \end{aligned} Ck+1jCkjCkj1Ckj+Ckj1=(k+1j)!j!(k+1)!=(kj)!j!k!=(kj+1)!(j1)!k!=(kj)!(j1)!k!(j1+kj+11)=[(kj)!(kj+1)][(j1)!j]k!(k+1)=(k+1j)!j!(k+1)!=Ck+1j
所以
P i k + 1 = ∑ j = 0 k + 1 C k + 1 j ( 1 − t ) k − j + 1 t j P i + j P_{i}^{k+1}=\sum ^{k+1}_{j=0} C_{k+1}^{j} \left( 1-t\right) ^{k-j+1}t^{j}P_{i+j} Pik+1=j=0k+1Ck+1j(1t)kj+1tjPi+j

贝塞尔曲线的性质:

  1. 各项系数之和为1
    ∑ j = 0 n C n j ( 1 − t ) n − j t j = ( 1 − t + t ) n = 1 \sum ^{n}_{j=0}C_{n}^{j}\left( 1-t\right) ^{n-j}t^{j}=(1-t + t)^n=1 j=0nCnj(1t)njtj=(1t+t)n=1
  2. 凸包性
    由性质1可知贝塞尔曲线是控制点的凸组合,所以贝塞尔曲线始终包含在所有控制点组成的最小凸多边形中。也就是可以通过控制点的凸包来限制规划曲线的范围,这在路径规划中是很好的一条性质。
  3. 端点性质
    第一个控制点和最后一个控制点,恰好是曲线的起始点和终止点。可以将 t = 1 t=1 t=1 0 0 0代入,除了起始点和终止点的其他控制点的系数都是0。
  4. 一阶导数性质:贝塞尔曲线在 t = 0 t=0 t=0时的导数与 P i P i + 1 P_iP_{i+1} PiPi+1方向相同,在 t = 1 t=1 t=1时的导数与 P i + n − 1 P i + n P_{i+n-1}P_{i+n} Pi+n1Pi+n方向相同
    d P i n d t = d ( 1 − t ) n d t P i + ∑ j = 1 n − 1 C n j P i + j [ ( 1 − t ) n − j d t j d t + d ( 1 − t ) n − j d t t j ] + d t n d t P n = − n ( 1 − t ) n − 1 P i + n t n − 1 P i + n + ∑ j = 1 n − 1 C n j P i + j [ j ( 1 − t ) n − j t j − 1 − ( n − j ) ( 1 − t ) n − j − 1 t j ] \begin{aligned} \dfrac{{\rm d}P_{i}^{n}}{{\rm d}t}&=\dfrac{{\rm d}\left( 1-t\right) ^{n}}{{\rm d}t}P_{i}+\sum^{n-1}_{j=1}C_{n}^{j}P_{i+j}\left[ \left( 1-t\right) ^{n-j}\dfrac{{\rm d}t^{j}}{{\rm d}t}+\dfrac{{\rm d}\left( 1-t\right) ^{n-j}}{{\rm d}t}t^{j}\right] +\dfrac{{\rm d}t^{n}}{{\rm d}t}P_{n}\\ &=-n\left( 1-t\right) ^{n-1}P_{i}+nt^{n-1}P_{i+n}+\sum ^{n-1}_{j=1}C_{n}^{j}P_{i+j}\left[ j\left( 1-t\right) ^{n-j}t^{j-1}-\left( n-j\right) \left( 1-t\right) ^{n-j-1}t^{j}\right] \end{aligned} dtdPin=dtd(1t)nPi+j=1n1CnjPi+j[(1t)njdtdtj+dtd(1t)njtj]+dtdtnPn=n(1t)n1Pi+ntn1Pi+n+j=1n1CnjPi+j[j(1t)njtj1(nj)(1t)nj1tj]
    d P i n d t ∣ t = 0 = − n P i + C n 1 P i + 1 = n ( P i + 1 − P i ) d P i n d t ∣ t = 1 = n P i + n − C n n − 1 P i + n − 1 = n ( P i + n − P i + n − 1 ) \begin{aligned} \dfrac{{\rm d}P_{i}^{n}}{{\rm d}t}| _{t=0}&=-nP_{i}+C_{n}^{1}P_{i+1}=n\left( P_{i+1}-P_{i}\right) \\ \dfrac{dP_i^{n}}{dt}| _{t=1}&=nP_{i+n}-C_{n}^{n-1}P_{i+n-1}=n\left( P_{i+n}-P_{i+n-1}\right) \end{aligned} dtdPint=0dtdPint=1=nPi+Cn1Pi+1=n(Pi+1Pi)=nPi+nCnn1Pi+n1=n(Pi+nPi+n1)

分段贝塞尔曲线

虽然贝塞尔曲线的阶数可以很高,但是如果曲线的阶数过高,调整控制点对曲线的影响就比较小,调整起来相当麻烦。
于是,我们常常使用分段的贝塞尔曲线,保证每一小段不会太复杂。这样每次只用调小段,还可以做到只调局部不影响大局,那就相当舒服了。

分段带来的唯一问题是,曲线在段与段的交界处,如何保证平滑?

所谓平滑,其实就是一阶导数连续,也就是左右导数的极限相同。

对两侧的贝塞尔曲线求导,分别代入 t=0 和 t=1 (即贝塞尔曲线的开始和结束时间),让二者相等。此时能发现,当两侧控制点与分段交接点共线且形成的线段长度相等时,满足曲线平滑性质。

参考资料

B样条曲线

样条是通过一组指定点集而生成平滑曲线的柔性带。 简单地说,B 样条曲线就是通过控制点局部控制形状的曲线。不太理解的同学可以通过本文底部的 demo 查看 B 样条曲线中,控制点对曲线绘制的影响。
贝塞尔曲线有以下缺陷:

  1. 确定了多边形的顶点数(n+1个),也就决定了所定义的Bezier曲线的阶次(n次),这样很不灵活。
  2. 当顶点数(n+1)较大时,曲线的次数较高,曲线的导数次数也会较高,因此曲线会出现较多的峰谷值。
  3. 贝塞尔曲线无法局部修改。

B样条曲线除了保持Bezier曲线所具有的优点外,还弥补了上述所有的缺陷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器是什么

服务器是什么 服务器是什么:服务器英文名称为“Server”,指的是网络环境下为客户机(Client)提供某种服务的专用计算机,服务器安装有网络操作系统(如Windows Server、Linux、Unix等)和各种服务器应用系统软件(如Web服务、电子邮件服务)&#…

操作系统:进程的创建(fork函数)、进程的替换(exec函数)、进程的阻塞(wait函数)、进程的终止(exit函数)、进程的挂起(sleep函数)

文章目录1.进程的创建2.进程的替换3.进程的阻塞4.进程终止5.进程的挂起1.进程的创建 ①调用fork函数的进程为父进程,调用后生成一个子进程; ②创建子进程成功时,父进程中fork函数的返回值是子进程的进程号PID; ③创建子进程失败时…

关于Java代码如何项目部署

在研究注解的时候会用到反射,在学习反射的时候会涉及到关于class文件的生成,以及Class文件是如何被执行的等一系列关于文件转换的问题,接下来就借助学习反射来学习一下项目整体部署的过程和每个阶段要生成的文件. 我们写的代码写完并测试之后…

粒子群算法求解电力系统环境经济调度+微电网调度(风、光、电动车、柴油机、主网)(Python代码实现)

目录 1 电力系统环境经济调度数学模型 2 改进粒子群算法解决 2.1 知识回顾 2.2 案例1——IEEE6节点 2.3 案例2——IEEE10 2.4 案例3——IEEE40 3 Python代码 1 电力系统环境经济调度数学模型 2 改进粒子群算法解决 2.1 知识回顾 先回顾一下相关知识点: *智…

打开网站出现Internal Server Error的原因和解决方法

打开网站出现Internal server error 500错误,通常是服务端出现一些未知异常,但是在检查的时候我们不能仅仅只是关注应用服务,而是要关注从服务端接收请求开始,一直到应用服务的整条链路。 程序文件中的权限问题导致Internal Serv…

正确的PMP®答题思路——让你考试更轻松

想要考取PMP的小伙伴们,大家现在复习的如何呢?是不是还在不断刷题呢?做题不单单需要充足的知识储备,更需要正确的答题思路,今天小编给大家整理了PMP考试答题的一些思路,想要考取PMP的小伙伴们快来看看吧&am…

Wireshark过滤器语法

1.官网地址 点击进入 2.捕获过滤器 使用捕获过滤器Wireshark只捕获满足过滤器条件的数据包进来。捕获过滤器采用BPF语法表达式,表达式由如下及部分组成: Dir 指明传输方向是前往还是来自 例如:src、dst Type 指出名字或数字所代表的意,例如…

SpringCloud微服务(七)——Bus服务消息总线

SpringCloud Bus动态刷新全局广播 SpringCloud Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新,通知一处,处处生效。而不用一个一个去通知。 Spring Cloud Bus是消息总线,广播通知都可以集成,不止用于实现…

java项目测试成功后部署到服务器上的相关问题

1.java项目是如何部署给用户使用的? 前提: 以一个web项目为例, 使用工具:开发工具:IDEA;Tomcat(应用服务器);Navicat(数据库);Jenkins&#xff…

CDMP考试需不需要参加培训课程?培训机构哪家比较好?

参加CDMP认证考试到底要不要参加培训课程,身边的很多同学都参加了培训班,我要参加吗?总是会有很这样的人提出这样的问题。 那么,我想说考试的结果不在于你定什么样的目标,如何做计划,而在于你何时开始行动…

Flutter高仿微信-第26篇-新的朋友

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: /*** Author : wangning* Email : maoning20080809163.c…

智慧餐厅解决方案-最新全套文件

智慧餐厅解决方案-最新全套文件一、建设背景二、建设思路1、刺激消费手段单一2、用户信息反馈量少3、商家推广覆盖面小4、生产力利用率偏低三、建设方案1 、组织人事在线管理,盘活内部人力资源2、多样化考勤方式,轻松实现多地工时管理3、数据成本分析&am…

大数据(9f)Flink状态编程

文章目录概述Managed StateOperator StateListStateBroadcastStateKeyed StateValueStateListStateMapStateReducingStateAggregatingState状态后端Appendix概述 流式计算 分为 无状态计算 和 有状态计算 流处理的状态功能:去重、监控…… 状态分类Managed StateR…

半诚实模型与恶意模型

原创 洪澄 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。 178篇…

【Unity】自定义Untiy天空

3、需求:更改默认天空盒,360显示所需的内容。 实施: 准备材料:一张8K图(更清晰) 步骤: 1、更改Camera为天空盒; 2、制作图片,怎么制作不说了,分辨率8192…

Linux服务器安装部署最新稳定版本mongoDB社区版- Ubuntu-20.04版本

没有玩过mongoDB,安装一次真🤬波折,再次建议大家安装之前,一定要确定好服务器的操作系统,可以参考查看linux操作系统版本:Ubuntu?Centos?还是其他? 接前面在本地自测需要…

解决jupyter下载好了库,但是无法使用的问题。以及补充jupyter如何下载新的库。

文章目录出现原因验证解决步骤补充国内常用镜像源出现原因 出现这个问题的主要原因是,jupyter的内核(或者说他使用的Python环境)与下载库的环境不一样,解决办法就是更改kernel。换句话说就是将jupyter下载库的环境加入到内核环境…

模拟双色球系统——Java

目录 一、内容简介 二、 基本流程 三、具体步骤 1.菜单栏 2.随机生成幸运号码 3.用户输入 4.判断中奖情况 5.打印数组 四、代码实现 五、效果展示 一、内容简介 双色球是彩票的一种玩法,规则如下: 红球一共6组,每组从1——33中随…

微信h5 使用jssdk支付成功后,点击完成 页面关闭了,引出微信“点金计划“

可能会迷惑 为啥我们之前没有碰见过这种情况! 这样的情况只有两种情况,就是 你只是普通商户不是微信特约商户你的支付跳转功能还未被微信回收 那么怎么才能支付成功重新跳回自己的网站页面 刚开始经历这种情况的童鞋, 可能有点懵逼 先看个微信的之前发的一个公告吧 微信支付公…

面试系列分布式事务:谈谈3PC的理解

3PC就是三阶段提交是在二阶段提交上的改进版本,3PC最关键要解决的就是协调者和参与者同时挂掉的问题,所以3PC把2PC的准备阶段再次一分为二,这样三阶段提交。处理流程如下 : 阶段一 a) 协调者向所有参与者发出包含事务内容的 canCo…