1.实验目的
掌握Bezier曲线的定义原理及绘制过程

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

2. 实验要求:
利用OpenGL实现一个三次Bezier曲线,任意输入四个控制点,绘制出对应的贝塞尔曲线;并通过鼠标调整控制点(随机变化或沿某种图案变化)让曲线动态显示。

3.实验代码(部分)
需要先安装glut库

#include<GL/glut.h>
#include<GL/GL.h>
#include<math.h>
void mouseClick(int button, int state, int x, int y)
{if (button == GLUT_LEFT_BUTTON)  {if (state == GLUT_DOWN) {if (mask == -1) {for (int i = 0; i < 4; i++){float mouse_x = (x - 200) / 200.0f, mouse_y = (200 - y) / 200.0f;float dis = sqrt((mouse_x - ctrl_points[i][0]) * (mouse_x - ctrl_points[i][0]) + (mouse_y - ctrl_points[i][1]) * (mouse_y - ctrl_points[i][1]));if (dis < 0.1f) mask = i;}}}else if (state == GLUT_UP)mask = -1;}
}

deCateljau算法:
在C++中,Bezier曲线常使用deCateljau算法生成,其思想就是每一次都遍历相邻的控制点,根据给定参数t在两相邻控制点形成的线段上取一个新的控制点。这样,每遍历一遍之前的控制点后生成的新控制点会更加逼近Bezier曲线,且控制点的数量减1,当最后只剩一个控制点时,可以将这个控制点视为Bezier曲线上的点。

void de_Cateljau(int n, GLfloat list[][2])
{float R_x[4];float R_y[4];int k = 0;for (double t = 0.0; t <= 1; t += 0.1){for (int i = 0; i < n; i++) {R_x[i] = ctrl_points[i][0];R_y[i] = ctrl_points[i][1];}for (int i = 1; i < n; i++){for (int j = 0; j < n - i; j++){R_x[j] = (1 - t) * R_x[j] + t * R_x[j + 1];R_y[j] = (1 - t) * R_y[j] + t * R_y[j + 1];}}list[k][0] = R_x[0];list[k][1] = R_y[0];k++;}
}

绘制函数:

void display() {glClearColor(1.0, 1.0, 1.0, 1.0);//(R,G,B,alpha)自己设置glClear(GL_COLOR_BUFFER_BIT);//当前可写的颜色缓冲glPointSize(3);  glColor3f(0.53,0.51,0.78);for (int i = 0; i < 4; i++) {glBegin(GL_POINTS);//把每个顶点作为一个点进行处理,顶点n定义了点n,绘制N个点。glVertex2fv(&ctrl_points[i][0]);glEnd();}glColor3f(0.53,0.51,0.78);glBegin(GL_LINE_STRIP);//绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,绘制n-1条线段for (int i = 0; i < 4; i++) {glVertex2fv(&ctrl_points[i][0]);}glEnd();GLfloat pos_list[11][2] = { 0 };de_Cateljau(4, pos_list);glColor3f(1.0, 1.0, 0.0);glBegin(GL_LINE_STRIP);for (int i = 0; i < 11; i++) {glVertex2fv(pos_list[i]);//指定顶点}glEnd();glFlush();//强制刷新缓冲,保证绘图命令将被执行}

4.结果样例图

可以拖动任意点改变bezier曲线的形状。完整源码点这里获取。

计算机图形学:Bezier曲线的绘制相关推荐

  1. 计算机图形学Bezier曲线试题,《计算机图形学》试题-C卷及参考答案

    计算机图形学试题 C 一.选择题(20分) 1.计算机图形显示器一般使用什么颜色模型?(A ) A. RGB B. CMY C. HSV D. HLS 2.分辨率为1024×1024的显示器各需要多少 ...

  2. 计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)

    一.实现方案 贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一.它通过控制曲线上的四个点(起始点.终止点以及两个相互分离的中间点)来创造.编辑图形.其中起重 ...

  3. 计算机图形学曲线生成原理,计算机图形学_曲线及生成.ppt

    计算机图形学_曲线及生成 华中理工大学计算机学院 陆枫 99-7 1999年7月 7.2.1 曲线的表示要求 1)唯一性 2)几何不变性 3)易于定界 4)统一性 5)易于实现光滑连接 6)几何直观 ...

  4. 计算机图形学 | 实验四:绘制一个球体

    计算机图形学 | 实验四:绘制一个球体 计算机图形学 | 实验四:绘制一个球体 封装Shader 为什么要封装Shader 如何使用 绘制球模型 球面顶点遍历 构造三角形图元 开启线框模式 开启面剔除 ...

  5. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

  6. bezier 曲线的绘制 matlab实现

    Bezier曲线的定义如下: 下面用matlab实现Bezier曲线的绘制: 1.绘制二维bezier曲线代码如下: function [X,Y]=bezier2(x,y) %用法: %bezier( ...

  7. 计算机图形学 | 实验三:绘制一个四边形

    计算机图形学 | 实验三:绘制一个四边形 计算机图形学 | 实验三:绘制一个四边形 初始化 顶点输入 数据处理 VAO.VBO 顶点属性 顶点着色器和片段着色器 渲染 EBO 完整代码 华中科技大学& ...

  8. 【Python】Bezier曲线的绘制

    Bezier曲线的绘制 r(u)=∑iJn,i(u)Vir(u) = \sum_i{J_{n,i}(u)V_i}r(u)=∑i​Jn,i​(u)Vi​ Jn,i=Cniui(1−u)n−iJ_{n,i ...

  9. mysql 工具图形学_[计算机图形学]贝塞尔曲线

    一. 贝塞尔曲线 简介摘抄自某度百科: 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线. 一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与 ...

最新文章

  1. vi vim 插入 删除 修改 文本
  2. 33 SD配置-销售凭证设置-定义销售凭证的号码范围
  3. php5.5 getter setter,实现了一个PHP5的getter/setter基类的代码
  4. Linux : 文件处理命令
  5. div居中以及div中的元素居中
  6. Elasticsearch: Cerebro 用户界面介绍
  7. 《Android开发秘籍(第2版)》——第1.4节Android设备间的硬件差异
  8. KEYCODE_DPAD_CENTER 和 KEYCODE_ENTER
  9. java将数字转为大写(1转为一)
  10. 分享一个去水印接口,完全免费,早点下手啊
  11. 如何部署在线团队协作系统kooteam(在线团队协作工具)
  12. 电影影视网站搭建教程
  13. 咸鱼 转转,苹果产品真伪验证
  14. Flutter TextField 去掉下滑线和底部字符数计数
  15. 揭开手机app中摇一摇的神秘面纱
  16. C#毕业设计——基于C#+asp.net+cs的Web Mail邮件收发系统设计与实现(毕业论文+程序源码)——邮件收发系统
  17. 网络(HCNA00笔记)
  18. java实验2实验报告(20135232王玥)
  19. POJ 2411: Mondriaan's Dream
  20. 计算机网络笔记和课后题,彭兰《网络传播概论》(第4版)笔记和课后习题详解...

热门文章

  1. 迅雷星域CDN众筹引来小米,平安WiFi众筹意欲何为
  2. Python安装教程(Windows10)
  3. 中国血糖检测仪市场投资现状分析与需求前景预测报告2022年版
  4. 第四讲图:最短路径两种经典算法学习总结2
  5. Android踩坑经验-notifyDataSetChanged列表不刷新问题分析
  6. centos7安装gparted分区工具
  7. 考虑延迟环节的电流环设计
  8. 两个EXCEL文件的比较
  9. 安卓APP保活--十种方案
  10. 使用友善之臂Mini2440开发板使用网口下载程序不成功血与泪的经验教训