OpenGL画bezier曲线
作者:Arururururu 发布时间:2021-11-30 19:09:06
标签:OpenGL,bezier,曲线
Bezier Curve算法是根据参数曲线方程来得到光滑曲线的一种算法,曲线方程的参数由控制点决定。
其本质是由调和函数根据控制点插值而成,其参数方程如下:
其中Pi(i=0,1,…,n)为控制点的向量,
Bi,n(t)为伯恩斯坦Bernstein基函数,其多项式表示为:
线性Bezier Curve由两个控制点决定:
二次Bezier Curve由三个控制点决定:
三次Bezier Curve由四个控制点决定:
如下图,t = AE:AB = BF:BC = CG:CD = EH:EF = FI:FG = HJ:HI,J即为Bezier曲线上的点
t取0到1的过程就把bezier曲线画出来了。
Bezier Curve的特点:
1、端点性质:通过起点和终点;
2、对称性:保持顶点位置不变,顺序颠倒,新曲线的形状不变,只是参数变化的方向相反;
3、凸包性:由二项式定理得知Bi,n(t)求和为1,即Bi,n(t)构成了Bezier曲线的一组权函数,因此Bezier曲线一定落在其控制多边形的凸包之中。
4、几何不变性:Bezier曲线的形状只与其控制点的相对位置有关,与坐标变化无关。
实现三次Bezier曲线函数的代码如下:vector用于储存构成曲线的点坐标,若每次都重新分配会导致堆溢出,因此每次都用同一内存空间
//用于存储画曲线的点坐标
float* vector = new float[2000];
float* bezierCurve(float step, float* points) {
//一共有几个点
int size = 1.0 / step;
float t = 0.0f;
//参考公式 Q(t)=(1-t)^3*P0 + 3t(1-t)^2*P1 + 3t^2(1-t)*P2 + t^3*P3
for (int index = 0; index < size; index++, t += step) {
vector[index * 3] = (1 - t)*(1 - t)*(1 - t)*points[0] + 3 * t*(1 - t)*(1 - t)*points[3]
+ 3 * t*t*(1 - t)*points[6] + t*t*t*points[9];
vector[index * 3 + 1] = (1 - t)*(1 - t)*(1 - t)*points[1] + 3 * t*(1 - t)*(1 - t)*points[4]
+ 3 * t*t*(1 - t)*points[7] + t*t*t*points[10];
vector[index * 3 + 2] = 0.0f;
}
return vector;
}
【部分运行效果】
用鼠标左键点击四个点,根据点的顺序画出三次Bezier曲线
改变点的顺序,得到新的Bezier曲线
来源:https://blog.csdn.net/unirrrrr/article/details/80399020
0
投稿
猜你喜欢
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- IDEA打成jar包并在windows后台运行一、IDEA打成jar包1、File=>Project Structure=>Pr
- for循环语句重复执行语句,直到条件变为 false。语法for ( init-expression ; cond-expression ;
- 前言在开发过程中需要快速新建getXXX();setXXX()方法的时候,就会想能否批量实现呢?例如实现如下代码,一次性操作,不是一个一个码
- •强引用(FinalReference),在java中,有点像C++的指针,通过引用,可以对堆中的对象进行操作。强引用具备以下特点: 1.强
- java 中HashCode重复的可能性今天有同事提议用String的hashcode得到int类型作为主键。其实hashcode重复的可能
- Java中的main函数的详细介绍JAVA中的主函数是我们再熟悉不过的了,相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数,
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- springboot就是简化Spring应用中的初始化配置,快速创建项目而生的。创建springboot项目代开idea,点击File—&g
- 生成excel并导出到对应位置package tech.BurtonPratice; import org.apache.poi.hssf.
- 前言Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧密集成,可以很方便地在 Java 项目中使用。Groovy 有着简洁的
- 前言本文主要介绍其具体的实现思路(视频仅有代码输入,并无过程介绍等),同时,在原本实现的基础上,进行了多处修改和优化,具体参见下面的内容。优
- 1 配置多数据源时,application.yml 的有关mybatis的配置是失效的,因为他不知道配置哪一个数据源2 applicatio
- 查找应用进程PID杀死应用进程PID运行启动脚本烦不烦啊,像我这么懒得人 得想个办法一步搞定!如下所示 新建一个shell脚本,然后将其运行
- 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉
- 1、三元运算符:class Program {  
- FileStream缓冲读取和写入可以提高性能。FileStream读取文件的时候,是先将流放入内存,经Flush()方法后将内存中(缓冲中
- 什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间
- 关于为什么需要创建单例?这里不过多介绍,具体百度知。 关于C# 创建单例步骤或条件吧1、声明静态变量;2、私有构造函
- DataHub 类似于传统大数据解决方案中 Kafka 的角色,提供了一个数据队列功能。DataHub 除了供了一个缓冲的队列作用。同时由于