贝塞尔曲线

贝塞尔曲线(Bézier curve)是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是用来做这种矢量曲线的。

贝塞尔曲线由四个点(起始点、终止点以及两个相互分离的中间点)定义。滑动两个中间点,贝塞尔曲线的形状会发生变化。其可以通过三个点来确定一条平滑的曲线,而其有趣之处更在于它的“皮筋效应”,也就是说,随着点有规律地移动,曲线将产生皮筋伸引一样的变换,带来视觉上的冲击。

在历史上,研究贝塞尔曲线的人最初是按照已知曲线参数方程来确定四个点的思路设计出这种矢量曲线绘制法。 1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。

贝塞尔曲线根据控制点的数量分为:

1、一阶贝塞尔曲线(2 个控制点)

2、二阶贝塞尔曲线(3 个控制点)

3、三阶贝塞尔曲线(4 个控制点)

4、n阶贝塞尔曲线(n+1个控制点)

计算二阶贝塞尔曲线的例子:

#include <iostream>
#include <vector>
#include <cmath>
​
struct Point {double x, y;
};
​
Point bezierCurve(const std::vector<Point>& controlPoints, double t) {int n = controlPoints.size() - 1;std::vector<Point> tempPoints(n + 1);
​for (int i = 0; i <= n; ++i) {tempPoints[i].x = (1 - t) * (1 - t) * (1 - t) * controlPoints[i].x +3 * (1 - t) * (1 - t) * t * controlPoints[i + 1].x +3 * (1 - t) * t * t * controlPoints[i + 1].x +t * t * t * controlPoints[i + 1].x;tempPoints[i].y = (1 - t) * (1 - t) * (1 - t) * controlPoints[i].y +3 * (1 - t) * (1 - t) * t * controlPoints[i + 1].y +3 * (1 - t) * t * t * controlPoints[i + 1].y +t * t * t * controlPoints[i + 1].y;}
​return tempPoints[0];
}
​
int main() {std::vector<Point> controlPoints = {{0, 0}, {0.5, 1}, {1, 0}};double step = 0.01;
​for (double t = 0; t <= 1; t += step) {Point pointOnCurve = bezierCurve(controlPoints, t);std::cout << "t: " << t << ", x: " << pointOnCurve.x << ", y: " << pointOnCurve.y << std::endl;}system("pause");return 0;
}
​

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全B模块(笔记详解)- Web渗透测试

Web渗透测试 1.通过渗透机Kali1.0对服务器场景PYsystem20192进行Web渗透测试(使用工具w3af的对目标Web服务器进行审计),在w3af的命令行界面下,使用命令列出所有用于审计的插件,将该操作使用的命令作为Flag值提交; 进入kali命令控制台中使用命令w3af_console进入w3af命令…

经验分享:知识库系统这样搭建轻松又高效

我们工作中遇到过这样的情况吗&#xff1f;找不到组织结构图&#xff0c;找不到某个报告模板&#xff0c;找不到工作流程说明… 还或者看到同事忙绿在重复劳动&#xff0c;却没办法高效地共享你的经验和知识&#xff1f;这些都表明你的公司可能正急需一个知识库系统。 知识库系…

springCould中的Config-从小白开始【10 】

目录 &#x1f32d;1.spring cloud Config是什么&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️ &#x1f953;2.能干什么&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️ &am…

【算法Hot100系列】有效的数独

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【Scala】——流程控制

1 if-else 分支控制 让程序有选择的的执行&#xff0c;分支控制有三种&#xff1a;单分支、双分支、多分支 1.1单分支 if (条件表达式) {执行代码块 }1.2 双分支 if (条件表达式) {执行代码块 1 } else {执行代码块 2 }1.3 多分支 if (条件表达式1) {执行代码块 1 } else …

【C/C++】轻量级跨平台 开源串口库 CSerialPort

文章目录 1、简介2、支持的平台3、已经支持的功能4、Linux下使用5、使用vcpkg安装CSerialPort6、交叉编译7、效果图8、基于CSerialPort的应用8.1、CommMaster通信大师8.2、CommLite串口调试器 1、简介 Qt 的QSerialPort 已经是跨平台的解决方案&#xff0c;但Qt开发后端需要 Q…

Java泛型:灵活多变的类型参数化工具

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、泛型1、什么是泛型2、泛型的语法 二、泛型类的使用1、泛型类的语法2、泛型如何编译的2.1、擦除机制2.2、为什么不能实例化泛…

低代码开发平台在工业领域的应用场景

随着科技的不断发展&#xff0c;低代码开发平台在工业场景中的应用越来越广泛。低代码开发平台通过提供可视化的界面和预构建的模块&#xff0c;使得开发人员能够快速地构建应用程序&#xff0c;而不需要编写大量的代码。这种技术的应用&#xff0c;不仅可以提高开发效率&#…

7+单细胞+空转+实验验证,如何根据内容开展相关经验给你启发

导语 今天给同学们分享一篇生信文章“CD8 tissue-resident memory T cells induce oral lichen planus erosion via cytokine network”&#xff0c;这篇文章发表在Elife期刊上&#xff0c;影响因子为7.7。 结果解读&#xff1a; 单细胞RNA测序揭示了具有不同临床亚型的OLP的细…

oracle11范围表空间实例

1.表分区&#xff1a;范围分区&#xff0c;散列分区&#xff0c;列表分区&#xff0c;组合分区&#xff0c;inetrval分区 范围分区&#xff1a;商品零售表&#xff0c;按照销售日期所在的季度创建4个分区 --先建立表空间&#xff1a;临时表空间是不可以存放数据的&#xff0c;…

网络原理OSI

目录 一、应用层 1、功能 2、协议的分类 二、UDP原理&#xff08;传输层&#xff09; 1、协议端格式 2、格式解释 三、TCP原理&#xff08;传输层&#xff09; 1、协议端格式 2、长度 3、可靠传输 &#xff08;1&#xff09;确认应答 &#xff08;2&#xff09;超时…

Java方法用法及解析

在 Java 中&#xff0c;方法&#xff08;Method&#xff09;是用于执行特定任务的代码块。它是一个函数&#xff0c;用于封装一段可重复执行的代码&#xff0c;并可以被其他代码调用。方法定义了一系列操作的步骤&#xff0c;并提供了一种结构化和可复用的方式来组织和执行这些…