一、 贝塞尔曲线

简介摘抄自某度百科:

贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。

一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。

贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。在Flash4中还没有完整的曲线工具,而在Flash5里面已经提供出贝塞尔曲线工具。

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

简单说,贝塞尔曲线就是通过若干控制点来控制的曲线。通过调整控制点,可以决定曲线的走势(不知道大家有没有被Word中曲线箭头支配的恐惧)。

贝塞尔曲线公式:

\[P_i^k = \left\{

\begin{array}{l}

P_i, k=0 \\

(1-t)P_i^{k-1} + tP_{i+1}^{k-1}, k=1,2,...,n, i=0,1,...,n-k-1\\

\end{array}

\right.

\]

先不考究公式的含义,先看公式的元素,不难发现,本质是点的线性组合。

\(P_i^k\)中的\(P\)指的点的坐标(二维的也好,三维的也罢);\(k\)指的第\(k\)次处理,\(k=0\)指的就是初始情况;\(i\)指的点的索引;\(n\)指的初始点的个数。

大概知道这些参数的含义(可能不太准确),举个例子:

//初始n=3,同时给定三个点P0、P1、P2坐标信息

//k=0,得到P0_0、P1_0、P2_0

//k=1,得到P0_1、P1_1

//k=2,得到P0_2

可以发现,每次迭代后生成的点的个数递减,因此每个\(t\)最终对应一个点,将这个点绘制即可。然后重复操作。

以上只是对公式的通俗解释,实际上公式的含义很明确,就是线性组合。

而贝塞尔曲线要完成的事情也很简单,就是根据给定的点,把曲线绘制出来就行了。怎么绘制?带进公式就行了。

1. 一阶贝塞尔曲线

一阶贝塞尔曲线有两个控制点,所以公式可以简化为:\(P = (1-t)P_0 + tP_1, t \in [0,1]\),显然,这是一个点的线性组合,所以最终得到的是一条直线。

2. 二阶贝塞尔曲线

二阶贝塞尔曲线有三个控制点,所以公式可以简化为:\(P = (1-t)^2P_0 + 2(1-t)tP_1 + t^2P_2, t \in [0,1]\),显然,这是一个关于\(t\)的二次函数,所以是一条抛物线。

3. 三阶贝塞尔曲线

三阶贝塞尔曲线有四个控制点,就不简化了,原理一样。

对于高阶贝塞尔曲线,直接从公式入手,递归即可,每次递归绘制一个点。

二、代码示例

//-----------------------------------------------

//功能描述:绘制贝塞尔曲线

//

//参 数:*ppoint[in],顶点坐标,[x1, y2],[x2, y2],...

// num[in],ppoint个数(num大于等于3,目前最大支持_BEZIER_POINT_NUM_MAX)

// color[in],颜色值

// step[in],步长(0

// *pInOut[in/out],传入前一点计算坐标,传出本次计算的点坐标

//

//返 回 值:void

//

//备注内容:无

//-----------------------------------------------

#define _BEZIER_POINT_NUM_MAX10

void G2D_DrawBezierCurve( float *ppoint, uint16_t num, uint16_t color, float step, float *pInOut )

{

float new_point[2*_BEZIER_POINT_NUM_MAX];

if (num > _BEZIER_POINT_NUM_MAX) {

USR_LOG_D("bezier curve point must between [3,%d]!", _BEZIER_POINT_NUM_MAX);

return;

}

if (1 == num)

{

TFT_DrawLine(pInOut[0], pInOut[1], ppoint[0], ppoint[1], color);

pInOut[0] = ppoint[0];

pInOut[1] = ppoint[1];

return;

}

else

{

for (int i=0; i

{

new_point[2*i+0] = (1-step)*ppoint[2*i] + step*ppoint[2*(i+1)];

new_point[2*i+1] = (1-step)*ppoint[2*i+1] + step*ppoint[2*(i+1)+1];

}

G2D_DrawBezierCurve(new_point, num-1, color, step, pInOut);

}

}

//贝塞尔曲线控制点1

_internal_ro float _k_bezier_ctl_point_buf1[][2] = {

{20, 220},

{70, 110},

{120, 115},

{170, 200},

{220, 100},

};

//贝塞尔曲线控制点2

_internal_ro float _k_bezier_ctl_point_buf2[][2] = {

{25,220},

{190,170},

{200,140},

{180,80},

{60,90},

{30,120},

{33,165},

{40,185},

{80,230},

{200,230},

};

//贝塞尔曲线控制点

_internal_ro float *_k_bezier_ctl_point[] = {

(float*)_k_bezier_ctl_point_buf1,

(float*)_k_bezier_ctl_point_buf2,

};

_internal_ro uint32_t _k_bezier_ctl_point_num[] = {

GET_ARRAY_NUM(_k_bezier_ctl_point_buf1),

GET_ARRAY_NUM(_k_bezier_ctl_point_buf2),

};

memcpy(dummy_result, _k_bezier_ctl_point[index], VERTEX_DATA_SIZE_2F);

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

{

G2D_DrawBezierCurve((float*)_k_bezier_ctl_point[index], _k_bezier_ctl_point_num[index], RED, 0.01f*i, dummy_result);

delay_ms(1000/25);

}

mysql 工具图形学_[计算机图形学]贝塞尔曲线相关推荐

  1. 坐标转换 计算机图形学_计算机图形学的转换类型

    坐标转换 计算机图形学 什么是转型? (What is Transformation?) Transformation refers to the mathematical operations or ...

  2. python计算机图形学_计算机图形学—— 隐藏线和隐藏面的消除(消隐算法)

    一.概述 由于投影变换失去了深度信息,往往导致图形的二义性.要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面(或可见线判定.可见面判定),或简称为消隐.经过消隐得到 ...

  3. 计算机图形学概论论文5000字,《论文_计算机图形学论文李(定稿)》

    <论文_计算机图形学论文李(定稿)> (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 计算机图形学论文学号:专业:计算机 ...

  4. 计算机图形学的发展与应用论文,计算机图形学毕业论文_计算机图形学发展趋势_计算机图形学有很多应用...

    有什么经典的计算机图形学论文吗? 想看计算机图形学的论文去搜这个方向的顶级会议或期刊,SIGGRAPH,EuroGraphics,TVCG,还有很多,直接搜一下都能知道,读这些顶级会议上的论文可以知道 ...

  5. 吉林大学计算机图形学实验_计算机图形学学习笔记(一):图形学概论

    第一章 计算机图形学概论 1.1 全书概述 图形学基本知识 光栅图形学 扫描转换.区域填充.裁减.反走样.消隐 二维.三维图形变换及观察 几何造型 参数曲线曲面基本概念.Bezier曲线曲面.B样条曲 ...

  6. 计算机图形学有很多应用,计算机图形学的论文_计算机图形学有很多应用_计算机科学与技术的论文...

    本人数学系,想考计算机图形学的研究生,请问我毕业论文改选下面哪项(无... 图形学里用到的数学知识主要是微积分(必备基础),线性代数(模型变换的基础),最优化理论与方法(写论文做研究的基础),微分几何 ...

  7. 画毛毛虫代码计算机图形学,考试计算机图形学考试计算机图形学.docx

    考试计算机图形学考试计算机图形学 计算机图形学大题第四章1个.第六章2个第七章1个第一章4.比较个人计算机与工作站的图形功能个人计算机仅限于符合二维,又是单任务操作方式工作站可处理二.三维,多任务操作 ...

  8. 【图形学】计算机图形学-练习题5

    [图形学]计算机图形学-练习题5 一.题目一 1.1 作业题目 1.2 作业解答 二.题目二 2.1 作业题目 2.2 作业解答 一.题目一 1.1 作业题目 1.2 作业解答 二.题目二 2.1 作 ...

  9. 【图形学】计算机图形学-练习题7

    [图形学]计算机图形学-练习题7 一.题目 1.1 作业题目 1.2 作业解答 二.题目 2.1 作业题目 2.2 作业解答 一.题目 1.1 作业题目 1.2 作业解答 二.题目 2.1 作业题目 ...

最新文章

  1. Win7命令终端基础配色指南
  2. Docker环境下:ImportError: libSM.so.6: cannot open shared object file: No such file or directory
  3. centos7离线安装oracle11g,CentOS 7.5离线安装Oracle 11gR2
  4. ios 一直是正在等待审核_iOS开发者账号被调查了,相关问题整理
  5. 尊贵的iPhone 11用户们,苹果喊你们换显示屏模块了……
  6. 给你一碗孟婆汤,你会忘记什么?
  7. elasticsearch集群部署
  8. python可以用来写什么_对于一个OIer,Python能干些什么?
  9. linux空间满了有什么问题,Linux 空间满问题分析 [ Keep Coding ]
  10. 数据库系统概论课后习题答案(第五版 王珊、萨师煊)
  11. 得物购买截图生成_这应该是目前为止,iPhone上最好的长截图工具!
  12. luogu P4315 月下“毛景树”
  13. 什么是MTTF MTBF MTRF
  14. ABAP 发布webservice调用外部webservice
  15. 第 11 章 进度条媒体对象和 Well 组件
  16. mvc java框架_java常用MVC框架说明与对比
  17. 揭开卓越供应链的秘密,走近人机协同的智能决策
  18. 五、vis 右键节点展开菜单
  19. Flutter 沙龙回顾 | 跨平台技术趋势及字节跳动 Flutter 架构实践
  20. 2023最新软件测试八股文,能不能拿心仪Offer就看你背得怎样了

热门文章

  1. 资源过于敏澸,8h删!这波福利....请笑纳。。
  2. 快速提升页面性能的必备利器
  3. 众测 Nebula Graph | 捉虫计划已开启,这项有礼
  4. 每日一问一周汇总:第1期
  5. 服务器系统版本选择,云服务器选择系统版本
  6. UML之类图和包图,对象图
  7. tensorflow.python.framework.errors_impl.DataLossError:
  8. python 多进程全局变量
  9. Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image
  10. cannot be registered to your development team. Change your bundle identifier to a unique string to t