关于曲线 规划 算法 线性 S曲线 贝塞尔曲线

工控领域经常会涉及速度加减速的算法:线性加减速,S曲线加减速(sin函数,拓展其他三角函数曲线), 贝塞尔曲线,等等。

线性加减速:    设定起始速度V0,目标速度V1,加速时间Ta(s,或加速度),这个的任务执行周期为ΔT( ms 级 或者设定定时器,定时时间必须大于任务周期否则还是按任务周期计算输出)。

int  iCounter ;

  iCounter = Ta/(ΔT/1000) ;     //计算达到输出  任务需执行的  周期数。

 for(int i =0; i<iCounter;i++ ) 

  Vout = V0+i*(V1-V0)/iCounter;          // Vout  为每个周期 输出 的 目标 速度。

S曲线加减速: 设定起始速度V0,目标速度V1,加速时间Ta(s,或加速度),这个的任务执行周期为ΔT( ms 级 或者设定定时器,定时时间必须大于任务周期否则还是按任务周期计算输出)。

  int  iCounter ;

  iCounter = Ta/(ΔT/1000) ;     //计算达到输出  任务需执行的  周期数。

  for(int i =0; i<iCounter;i++ ) 

     Vout = V0+(V1-V0)(1+Sin( (pi/iCounter)*i-pi/2 ));          // Vout  为每个周期 输出 的 目标 速度。

贝塞尔曲线:很少或者基本不用贝塞尔曲线来规划 曲线加减速,但是有必要了解贝塞尔曲线的原理,及其低阶曲线的算法(3、4控制点)。

贝塞尔曲线原理:

下面我们就通过例子来了解一下如何用 de Casteljau 算法绘制一条贝塞尔曲线。

在平面内任选 3 个不共线的点,依次用线段连接。

在第一条线段上任选一个点 D。计算该点到线段起点的距离 AD,与该线段总长 AB 的比例。

根据上一步得到的比例,从第二条线段上找出对应的点 E,使得 AD:AB= BE:BC

连接这两点 DE。

从新的线段 DE 上再次找出相同比例的点 F,使得 DF:DE= AD:AB= BE:BC

到这里,我们就确定了贝塞尔曲线上的一个点 F。接下来,请稍微回想一下中学所学的极限知识,让选取的点 D 在第一条线段上从起点 A 移动到终点 B,找出所有的贝塞尔曲线上的点 F。所有的点找出来之后,我们也得到了这条贝塞尔曲线。

如果你实在想象不出这个过程,没关系,看动画!

回过头来看这条贝塞尔曲线,为了确定曲线上的一个点,需要进行两轮取点的操作,因此我们称得到的贝塞尔曲线为二次曲线(这样记忆很直观,但曲线的次数其实是由前面提到的伯恩斯坦多项式决定的)。

当控制点个数为 4 时,情况是怎样的?

步骤都是相同的,只不过我们每确定一个贝塞尔曲线上的点,要进行三轮取点操作。如图,AE:AB= BF:BC= CG:CD= EH:EF= FI:FG= HJ:HI,其中点 J 就是最终得到的贝塞尔曲线上的一个点。

这样我们得到的是一条三次贝塞尔曲线。

看过了二次和三次曲线,更高次的贝塞尔曲线大家应该也知道要怎么画了吧。那么比二次曲线更简单的一次(线性)贝塞尔曲线存在吗?长什么样?根据前面的介绍,只要稍作思考,想必你也能猜出来了。哈!就是一条直线~

能画曲线也能画直线,是不是很厉害?要绘制更复杂的曲线,控制点的增加也仅仅是线性的。这一特点使其不光在工业设计领域大展拳脚,就连数学基础不好的人也可以比较容易地掌握,比如大多数平面美术设计师们。

上面介绍的内容并不足以展示贝塞尔曲线的真正威力。推广到三维空间的贝塞尔曲面,以及更进一步的非均匀有理 B 样条(NURBS),早已成为当今计算机辅助设计(CAD)的行业标准,不论是我们平常用到的各种产品,还是在电影院看到的精彩大片,都少不了它们的功劳。

2. 思路解析

百度百科上给出的一般参数公式是这样的: 给定点 P0,P1,P2, ... ,Pn,其贝塞尔曲线公式如下(即贝塞尔曲线上的点 B(t) 可由如下公式计算得到):

这里写图片描述

可以看出其公式是由一个格式固定的表达式之和来表示,这个表达式就是关键:

该表达式可分为四个部分看:

  • 从 i 递增到 n 的常数部分
  • Pi 坐标部分
  • (1 - t)^(n - i)
  • t^i 可以看出这四部分都与 i 的值相关,此外 t 值的计算方式为:i/(n+1)
如果直接从上面的公式上找规律比较抽象,那就从具体的例子中找规律吧:

设 Bt 为要计算的贝塞尔曲线上的坐标,N 为控制点个数,P0,P1,P2..Pn 为贝塞尔曲线控制点的坐标,当 N 值不同时有如下计算公式: 如 N 为 3 表示贝塞尔曲线的控制点有 3 个点,这时 n 为 2 ,这三个点分别用 P0,P1,P2 表示。

  • N = 3: P = (1-t)^2P0 + 2(1-t)tP1 + t^2*P2
  • N = 4: P = (1-t)^3P0 + 3(1-t)^2tP1 + 3(1-t)t^2P2 + t^3*P3
  • N = 5: P = (1-t)^4P0 + 4(1-t)^3tP1 + 6(1-t)2*t2P2 + 4(1-t)t^3P3 + t^4*P4

将贝塞尔曲线一般参数公式中的表达式用如下方式表示: 设有常数 a,b 和 c,则该表达式可统一表示为如下形式: a * (1 - t)^b * t^c * Pn;

分析当 N 分别为3,4,5 时对应 a,b,c 的值: 如 N = 3 时,公式有三个表达式,第一个表达式为 (1-t)^2*P0,其对应 a,b,c 值分别为:1,2,0

  • N = 3:   1,2,0   2,1,1   1,0,2 a: 1 2 1 b: 2 1 0 c: 0 1 2
  • N = 4:   1,3,0   3,2,1   3,1,2   1,0,3 a: 1 3 3 1 b: 3 2 1 0 c: 0 1 2 3
  • N = 5:   1,4,0   4,3,1   6,2,2   4,1,3   1,0,4 a: 1 4 6 4 1 b: 4 3 2 1 0 c: 0 1 2 3 4

根据上面的分析就可以总结出 a,b,c 对应的取值规则:

  • b: (N - 1) 递减到 0     (b 为 1-t 的幂)
  • c: 0 递增到 (N - 1)     (c 为 t 的幂)
  • a: 在 N 分别为 1,2,3,4,5 时将其值用如下形式表示:
    N=1:---------1 N=2:--------1  1 N=3:------1  2  1 N=4:-----1  3  3  1 N=5:---1  4  6  4  1 a 值的改变规则为: 杨辉三角

接下来就实现它:先再来一个例子
比如计算控制点坐标分别为:P0(3,8),P1(2,3),P2(2,7),想要返回 10 个在贝塞尔曲线上的点,用 java 可以这样写:

float[] p0 = {3, 8};

float[] p1 = {4, 3};

float[] p2 = {2, 7};

float[][] result = new float[10][2];

for (int i = 0; i < 10; i++)

{

float t = i / 10;

result[i][0] = (float) (1 * Math.pow(1 - t, 2) * Math.pow(t, 0) * p0[0] + 2 * Math.pow(1 - t, 1) * Math.pow(t, 1) * p1[0] + 1 * Math.pow(1 - t, 0) * Math.pow(t, 2) * p2[0]);

result[i][1] = (float) (1 * Math.pow(1 - t, 2) * Math.pow(t, 0) * p0[1] + 2 * Math.pow(1 - t, 1) * Math.pow(t, 1) * p1[1] + 1 * Math.pow(1 - t, 0) * Math.pow(t, 2) * p2[1]);

}

原文地址:https://www.cnblogs.com/oneway1990/p/9820884.html

时间: 2024-08-07 07:19:52

关于曲线 规划 算法 线性 S曲线 贝塞尔曲线的相关文章

Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现

Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状. 一次Bezier曲线公式: 一次Bezier曲线是由P0至P1的连续点,描述的一条线段 二次Bezier曲线公式: 二次Bezier曲线是 P0至P1 的连续点Q0和P1至P2 的连续点Q1 组成的线段上的连续点B(t),描述一条抛物线. 三次Bezier曲线公式: 二次Bezier曲线的实现 #include <vector> class CBezierCurve

深度掌握SVG路径path的贝塞尔曲线指令

一.数字.公式.函数.变量,哦,NO! 又又一次说起贝塞尔曲线(英语:Bézier curve,维基百科详尽中文释义戳这里),我最近在尝试实现复杂的矢量图形动画,发现对贝塞尔曲线的理解馒头那么厚,是完全不能承受富有创意的创作的,至少得有我当年追我老婆的脸皮厚才行. 然而,瞅瞅维基百科上的释义,或者其他一些相关的技术文章,总是离不开各种公式,一大堆变量……例如下面维基截图缩略图: 完全是数学爱好者的菜啊!我想,要是让UI设计师们去学习这些东西,估计还不如一刀来个痛快的! 这就是爱好领域与能力掌握的

【转~】初识贝塞尔曲线(B&#233;zier curve)

本文图文大多转自http://www.html-js.com/article/1628 QAQ我居然去扒维基,,,看不懂啊,,,我要去补数学,,, 在做变形小鸡的时候用到CSS3 transition-timing-function 属性,其语法如下: transition-timing-function: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n); 总而言之可以用cubic-bezier(n,n,n,n)的形式

贝塞尔曲线解析-Cocos2dx 01

在数学的数值分析领域中,贝塞尔曲线(英语:Bézier curve)是电脑图形学中相当重要的参数曲线.更高维度的广泛化贝塞尔曲线就称作贝塞尔曲面,其中贝塞尔三角是一种特殊的实例. 贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau算法开发,以稳定数值的方法求出贝塞尔曲线. 线性贝塞尔曲线[编辑] 给定点P0.P1,线性贝塞尔曲

贝塞尔曲线扫盲

相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.但是,可能并不是每位同学都清楚地知道,到底什么是"贝塞尔曲线",又是什么特点让它有这么高的知名度. 贝塞尔曲线的数学基础是早在 1912 年就广为人知的伯恩斯坦多项式.但直到 1959 年,当时就职于雪铁龙的法国数学家 Paul de Casteljau 才开始对它进行图形化应用的尝试,并提出了一种数值稳定的 de Casteljau 算法.然而贝塞尔曲线的得名,却是由于 1962 年另一位就职于雷

把商品添加到购物车的动画效果(贝塞尔曲线)

如图: 参考: Android补间动画,属性动画实现购物车添加动画 思路: 确定动画的起终点 在起终点之间使用二次贝塞尔曲线填充起终点之间的点的轨迹 设置属性动画,ValueAnimator插值器,获取中间点的坐标 将执行动画的控件的x.y坐标设为上面得到的中间点坐标 开启属性动画 当动画结束时的操作 难点: PathMeasure的使用 - getLength() - boolean getPosTan(float distance, float[] pos, float[] tan) 的理解

HTML5 Canvas中的贝塞尔曲线

在HTML5提供的画布功能,也就是Canvas中,getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.本文以getContext("2d")中提供的方法为例,简要研究了其中用于绘制曲线路径的贝塞尔曲线. JavaScript中的getContext("2d")为我们提供了两种绘制贝塞尔曲线路径的方法,分别是quadraticCurveTo()用于绘制二次贝塞尔曲线和bezierCurveTo()用于绘制三次贝塞尔曲线. 什么是贝塞

贝塞尔曲线开发的艺术

贝塞尔曲线开发的艺术 一句话概括贝塞尔曲线:将任意一条曲线转化为精确的数学公式. 很多绘图工具中的钢笔工具,就是典型的贝塞尔曲线的应用,这里的一个网站可以在线模拟钢笔工具的使用: http://bezier.method.ac/ 贝塞尔曲线中有一些比较关键的名词,解释如下: 数据点:通常指一条路径的起始点和终止点 控制点:控制点决定了一条路径的弯曲轨迹,根据控制点的个数,贝塞尔曲线被分为一阶贝塞尔曲线(0个控制点).二阶贝塞尔曲线(1个控制点).三阶贝塞尔曲线(2个控制点)等等. 要想对贝塞尔曲

自定义视图与贝塞尔曲线

APK下载地址 1.贝塞尔曲线 以下公式中: B(t)为t时间下 点的坐标: P0为起点,Pn为终点,Pi为控制点 一阶贝塞尔曲线(线段): 意义:由 P0 至 P1 的连续点, 描述的一条线段 二阶贝塞尔曲线(抛物线): 原理:由 P0 至 P1 的连续点 Q0,描述一条线段. 由 P1 至 P2 的连续点 Q1,描述一条线段. 由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线. 经验:P1-P0为曲线在P0处的切线. 三阶贝塞尔曲线: 通用公式: 高阶贝塞尔曲线: 4阶曲线: