贝塞尔曲线

计算机图形学入门16:曲线 计算机图形学入门,曲线,贝塞尔曲线,样条曲线。 阅读详情

贝塞尔曲线

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

一.相遇Bezier曲线

 

      在写这篇文章的时候,我正在广州一家游戏公司从事客户端的研发工作,使用Cocos2dx引擎。在游戏的开发过程中,有时候需要让对象沿着一条光滑的曲线运动,比如说怒气粒子沿着光滑的曲线运动到UI层的指定怒气槽。关于曲线的实现,直接调用Cocos2dx引擎中类CCBezierBy的API接口:static CCBezierBy* create(float t, const ccBezierConfig& c)

该接口需要曲线运动的时间t以及贝塞尔曲线的结构为ccBezierConfig的参数c.

引擎中ccBezierConfig定义如下:

 

/** @typedef bezier configuration structure
 */
typedef struct _ccBezierConfig {
    //! end position of the bezier
    CCPoint endPosition;
    //! Bezier control point 1
    CCPoint controlPoint_1;
    //! Bezier control point 2
    CCPoint controlPoint_2;
} ccBezierConfig;

 

简而言之,ccBezierConfig结构定义了三阶贝塞尔曲线的4个控制点: 起点(0,0), 控制点controlPoint_1, controlPoint_2和结束点endPosition.(当然,其中(0,0)点是隐藏知识)

转到其update函数中看看:

 

void CCBezierBy::update(float time)
{
    if (m_pTarget)
    {
        float xa = 0;
        float xb = m_sConfig.controlPoint_1.x;
        float xc = m_sConfig.controlPoint_2.x;
        float xd = m_sConfig.endPosition.x;

        float ya = 0;
        float yb = m_sConfig.controlPoint_1.y;
        float yc = m_sConfig.controlPoint_2.y;
        float yd = m_sConfig.endPosition.y;

        float x = bezierat(xa, xb, xc, xd, time);
        float y = bezierat(ya, yb, yc, yd, time);

#if CC_ENABLE_STACKABLE_ACTIONS
        CCPoint currentPos = m_pTarget->getPosition();
        CCPoint diff = ccpSub(currentPos, m_previousPosition);
        m_startPosition = ccpAdd( m_startPosition, diff);

        CCPoint newPos = ccpAdd( m_startPosition, ccp(x,y));
        m_pTarget->setPosition(newPos);

        m_previousPosition = newPos;
#else
        m_pTarget->setPosition(ccpAdd( m_startPosition, ccp(x,y)));
#endif // !CC_ENABLE_STACKABLE_ACTIONS
    }
}

 

可以看出,在知道了4个点p0, p1, p2, p3后,贝塞尔曲线在各个维度上的计算公式由bezierat(p0, p1, p2, p3)给出.

 

转到实现,其实现细节如下:

 

 

 

// Bezier cubic formula:
//    ((1 - t) + t)3 = 1 
// Expands to… 
//   (1 - t)3 + 3t(1-t)2 + 3t2(1 - t) + t3 = 1 
static inline float bezierat( float a, float b, float c, float d, float t )
{
    return (powf(1-t,3) * a + 
            3*t*(powf(1-t,2))*b + 
            3*powf(t,2)*(1-t)*c +
            powf(t,3)*d );
}

 

好,这就是和Bezier曲线的正式相遇,到现在,只知道了所谓的3阶Bezier曲线的一个应用,那么,它究竟是什么样的一条曲线?

 

 

二.贝塞尔曲线初探

     为了给对函数不太理解的朋友一些入门, 我这里用一个例子描述一下接下来内容所要表达的意思:

接下来的内容, 要做的事情就是:假定贝塞尔曲线的表达式是y=f(u),0≤u≤1, 其表达式是怎么样的?

举个例子: 我们都知道抛物线的表达式是

          y=f(x)=ax^2 + bx + c (a≠0)    也就是说,给定一个x值, 就确定了一点(x,ax^2 + bx + c)

          于是,当x取遍R上的每一个值,那么函数也就确定了其每一点, 其图像因此确定.

那么你懂了这个以后, 接下来的工作内容为,给定一个u, 请确定Bezier曲线上的一点(u, Bezier(u))

也就是确定y = Bezier(u) 0≤u≤1的函数解析式.

 

1.de Casteljau's 算法

    根据Bezier曲线的结构,一个重要的任务是:对于给定的u,0≤u≤1,如何确定贝塞尔曲线上的一点Bezier(u) ?

    

     1.1 线段u分点

    从A点出发,B为终点的向量为B-A, 假若u是0~1之间的一个数,那么u*(B-A)是向量B-A的u倍,加上起点A,那么向量 A+u(B-A)确定了点C, 且它分线段AB的比例为u:(1-u).

 

   由于C=A+u(B-A)=(1-u)A + uB,我们称:

线段AB的u分点C的表达式为   C=(1-u)A + uB

 

 

     1.2 de Casteljau's 算法

n阶贝塞尔曲线有n+1个控制点.

 

 

  • 当n=1时, 也就是贝塞尔曲线只由两个点P0, P1决定,直接取线段u分点,得到Bezier(u)=(1-u)P0 + uP1, 于是1阶Bezier曲线就是连接P0和P1的线段.

 

 

 

 

  • 当n=2时,贝塞尔曲线由三个点P0,P1,P2决定,
    • 先对P0和P1取线段u分点, 得到P10 = (1-u)P0 + uP1, 
    • 再对P1和P2取线段u分点, 得到P11 =(1-u)P1 + uP2, 
    • 于是得到两条线段上的两个u分点P10和P11, 
    • 对于两个u分点P10和P11, 再取线段u分点, 得到P20 = (1-u)P10 + uP11 = (1-u)((1-u)P0 + uP1) + u((1-u)P1 + uP2)=(1-u)^2P0 + 2(1-u)uP1 + u^2P2
    • 而P20即为贝塞尔曲线在u时的点;
    • 即: Bezier(u) = (1-u)^2P0 + 2(1-u)uP1 + u^2P2

 

 

 

 

  • 当n时, 贝塞尔曲线由n+1个点P0, P1,P2, ..., Pn决定.
    • 分别对线段P0P1, P1P2, ..., Pn-1Pn取线段u分点, 得到n个点P10, P11, ... P1n-1
    • 分别对线段P10P11, ... P1n-2P1n-1取线段u分点, 得到n-1个点P20, P21, ... P2n-2
    • ......
    • 分别对Pn-10Pn-11取线段u分点, 得到最后1个点Pn0. 这个点即为Bezier曲线在给定u时的点.

 

此过程可以由递归式:

表示.

 

 

而我们所求即为i=n, j=0时的值:

 

(此公式可以应用数学归纳法并利用递推公式证明)

 

 

至此, 在Coco2dx引擎中关于Bezier曲线的计算方法,就很明朗了, 它就是3阶的贝塞尔曲线:

 

其系数恰是3阶二项展开式的系数.

 

 

二.Bezier曲线的性质

 

2.1 系数性质

Bezier曲线其系数为下面的二项展开式第K项的系数:

因此二项式系数拥有的性质,它都有,包括但不限于[权性: 系数和为1].

2.2 曲线性质

2.2.1对称性

Bezier曲线的全部控制顶点位置不变,但次序颠倒,那么其曲线形状不变,参数u变为1-u.
即

2.2.2仿射不变性

即对于贝塞尔曲线做任意的仿射变换A, 可以将A作用在各个控制顶点上后再线性求和.
 
这点重要的性质, 意味着对Bezier曲线做几何变换是极其便利的.
 
举个例子, 当一个物体a在某个坐标系内做贝塞尔曲线运动, 而这个坐标系同时在做一个旋转运动,那么,如果旋转变换如果为R(theta), 那么该旋转变换可以相应作用在控制定点上;

2.2.3其他

略.

三.以下是参考的资料:

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html

 

 

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

贝塞尔曲线(Bezier Curve) 曲线和曲面 在生活中存在着各种各样光滑的曲线或曲面,例如汽车的表面,钢珠球等。 在建模的时候,我们通常使用很多的小三角形来逼近这样的曲面,因此放大了看,就会发现这些面其实是凹凸不平的。但是实际生活中,例如我身边的杯子,无论怎么看它都是一个光滑的表面。 那么我们应该怎么表达这些光滑的曲线或曲面呢?我们先从曲线入手,看看它的几种表达方式。 曲线的显示表达 学过函数我们知道,画出来的图其实就是一条曲线,如下: 二维空间中,曲线的显示表示是以自变量来表达因变量的值,例如在xy空间中,可... 阅读详情

相关推荐

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现

1. 定义 贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。 贝塞尔曲线的一些特性: 使用n个控制点来控制曲线的形状 曲线经过起点和终点,但不经过中间点~ 2.直观理解 ..

sinat_35676815的博客 8万+

【数学与算法】贝塞尔(Bézier)曲线

假如你有5个点P0、P1、P2、P3、P4P_0、P_1、P_2、P_3、P_4P0​、P1​、P2​、P3​、P4​,想根据这5个点拟合出一条曲线,那么,如果使用贝赛尔曲线的话,拟合的效果就如上图最后一个所示,最后一个图是4次贝塞尔曲线。4次贝塞尔曲线的控制点就是这五个点,其他点不是4次贝塞尔曲线控制点,确切的说,是递归需要用到的其他低阶次的控制点。 通过上面图,

u011754972的博客 3万+

贝塞尔曲线基础

贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算法开发,以稳定数值的方法求出贝兹曲线。

YiYeZhiNian的博客 2043

贝塞尔曲线与贝塞尔曲面

本文介绍了贝塞尔曲线与曲面的基本原理。贝塞尔曲线通过控制点和参数t的线性插值递归生成,n个控制点形成n-1次曲线,具有经过端点、与端点相切、仿射变换和凸包等性质。高阶贝塞尔曲线存在局部控制困难的问题,常用分段三次曲线拼接解决。贝塞尔曲面则扩展至三维,通过在u、v两个参数方向上分别进行插值计算生成。文章还简要提及B样条曲线和NURBS曲线的特点,它们能更好地实现局部控制和描述圆锥曲线。贝塞尔曲线广泛应用于图形设计、字体等领域。

人无远虑,必有近忧 4603

Android 贝塞尔曲线

Android 贝塞尔曲线一阶贝塞尔曲线二阶贝塞尔曲线三阶贝塞尔曲线: 今天给大家介绍的是贝塞尔曲线,什么是贝塞尔曲线呢?就是一个叫贝塞尔的人,发现了这个东西,然后就以他的名字命名为贝塞尔曲线,就像司马光砸缸一样,人家为啥要叫司马光砸缸,不叫小明砸缸小马砸缸呢?明明是司马光砸的刚功劳不能被别人抢走呀,好了好了这100多字都是废话,因为我在别的博客看的太多了,粘贴过来是真没意思。直接看效果上代码给大家介绍喽。 效果图(1.1): 咱们先来看一阶贝塞尔曲线: 一阶贝塞尔曲线 @Override

高级开发者进阶ing... QaQ 2518

浅谈贝塞尔曲线

浅谈贝塞尔曲线 前段时间做了一个手写板功能的东西,其中手写部分用二次贝塞尔曲线完成,今天就来总结一下贝塞尔曲线在Android中的应用,先简单介绍各阶贝塞尔曲线的原理,然后实现通过贝塞尔曲线实现波浪线功能,感兴趣的同学继续看下去吧! 概念 在数学的数值分析领域中,贝塞尔曲线(英语:Bézier curve,亦作“贝塞尔”)是计算机图形学中相当重要的参数曲线。更高维度的广泛化贝塞尔曲线就称作贝兹曲面...

子墨博客 4041

Unity 中贝塞尔曲线的实现

一、简介 贝塞尔曲线是最基本的曲线,一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。 一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用它的顺序 (n = 1 为线性,2 为二次,等.)。第一个和最后一个控制点总是具有终结点的曲线;然而,中间两个控制点 (如果有的话) 一般不会位于曲线上...

weixin_41946900的博客 6605

Android 贝塞尔曲线的魅力

前几天在手机优快云客户端看到一个QQ红点拖拽消失的效果,感觉挺好的,又回想到以前见到的诸如一下效果,感觉挺炫酷的,于是就看了下QQ拖拽的代码,记下笔记。 , 这个是在泡网上找到 还有一个指示器的效果,那个一时半会找不见了。UC浏览器新闻那一块的下拉刷新也是用了贝塞尔曲线的。什么是贝塞尔曲线 在数学的数值分析领域中,贝塞尔曲线, 又称贝赛尔曲线(Bézier曲线)是电脑图形学中

_StriveG的专栏 8759

贝塞尔曲线 总结

转载请注明出处:http://blog.youkuaiyun.com/tianhai110 Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用

PlayBoy's 部落格 3万+

ShardingSphere-JDBC-若依框架集成(SpringBoot)

ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架前后端版本、动态数据源,可自行切换,默认数据源为达梦8代理端,

编程小菜鸟的笔记 8168

简单的服务器取证

记一次入门服务器取证——药品直销网,涵盖旧版本宝塔、静态IP的配置更改、代码的理解

m0_74559567的博客 3756

贝塞尔曲线的公式推导贝塞尔曲线的公式推导,和 SVG 中 Path 的贝塞尔曲线指令的理解记忆

贝塞尔曲线的公式推导,和 SVG 中 Path 的贝塞尔曲线指令的理解记忆SVG Path 编辑器:知乎转 YouTube 的视频地址:张鑫旭老师:SVG 的贝塞尔曲线指令。

1245

InsightFace(RetinaFace + ArcFace)人脸识别实战:从模型部署到Web服务构建

本文详细介绍了如何利用InsightFace框架,结合其集成的RetinaFace人脸检测与ArcFace人脸识别预训练模型,从零开始构建一个高性能的Web人脸识别服务。内容涵盖环境搭建、模型部署、核心代码解析(包括五点仿射对齐关键步骤)、FAISS向量检索集成以及基于FastAPI的Web服务开发,并提供了实战优化与常见问题排查指南,帮助开发者快速实现工业级应用。

weixin_29054245的博客 225
上一篇: 【Lua学习笔记】 Lua中实现面向对象,转自云风的博客
下一篇: [算法练习]贪心算法之活动安排
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值