热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

OpenGL实现Bezier曲线的方法示例

今天小编就为大家分享一篇关于OpenGL实现Bezier曲线的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

Bezier曲线的形状是通过一组多边折线(特征多边形)的各顶点唯一地定义出来的。在这组顶点中:

(1)只有第一个顶点和最后一个顶点在曲线上;

(2)其余的顶点则用于定义曲线的导数、阶次和形状;

(3)第一条边和最后一条边则表示了曲线在两端点处的切线方向。

// BezierCurve.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
  • #include <gl/glut.h>
  • #include <gl/GL.h>
  • #define DIMENSION 2//定义维度为2维
  • typedef GLfloat VECTOR [DIMENSION];
  • VECTOR points[4]= {{-1.0,-1.0},{0.0,2.0},{1.0,2.0},{2.0,1.0}};//四个控制点
  • GLint count =10000;//绘制10000个点
  • int ww,hh;
  • void display()
  • {
  • VECTOR c[4];//此矩阵是P和M的积,就是控制点阵和Bezier基矩阵的乘积
  • for (int i =0;i<DIMENSION;i++)
  • {
  • c[3][i] = (0-points[0][i])+3*points[1][i]-3*points[2][i]+points[3][i];
  • c[2][i] = 3*points[0][i]-6*points[1][i]+3*points[2][i];
  • c[1][i] = (0-3*points[0][i])+3*points[1][i];
  • c[0][i] = points[0][i];
  • }
  • GLfloat v[DIMENSION];
  • GLfloat newV[DIMENSION];
  • GLfloat deltat = 1.0/count;
  • GLfloat t = 0.0;
  • glBegin(GL_LINE_STRIP);//绘制控制曲线
  • glVertex2fv(points[0]);
  • glVertex2fv(points[1]);
  • glVertex2fv(points[2]);
  • glVertex2fv(points[3]);
  • glEnd();
  • glFlush();
  • v[0] = points[0][0];v[1] = points[0][1];
  • for (int i = 0;i<count;i++)//绘制最终结果
  • {
  • t += deltat;
  • newV[0] = c[0][0] + t*(c[1][0] + t*(c[2][0] + t*c[3][0]));
  • newV[1] = c[0][1] + t*(c[1][1] + t*(c[2][1] + t*c[3][1]));
  • glColor3f(0.0,0.0,1.0);
  • glBegin(GL_LINES);
  • glVertex2fv(v);
  • glVertex2fv(newV);
  • glEnd();
  • glFlush();
  • v[0] = newV[0];v[1] = newV[1];
  • }
  • }
  • void init()
  • {
  • glClearColor(0.0 , 0.0 ,0.0 , 0.0);
  • glColor3f(1.0 ,1.0 ,1.0);
  • glMatrixMode(GL_PROJECTION);
  • glLoadIdentity();
  • gluOrtho2D(-4.0 ,4.0 ,-4.0 ,4.0);
  • }
  • void main(int argc,char **argv)
  • {
  • glutInit(&argc,argv);
  • glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
  • glutInitWindowSize(500,500);
  • glutInitWindowPosition(500,200);
  • glutCreateWindow("reshape");
  • //glutReshapeFunc(myreshape);
  • glutDisplayFunc(display);
  • init();
  • //glutIdleFunc(myidle);
  • //glutKeyboardFunc(mykeyboard);
  • //glutSpecialFunc(myspecialkey);
  • glutMainLoop();
  • }
  • 总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接


    推荐阅读
    • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
    • 本文介绍了一种高效的方法来计算特定月份内的工作日数量,并提供了一段SQL代码示例,该方法通过优化减少了不必要的循环,提高了查询效率。 ... [详细]
    • 2015款Chromebook Pixel评测:高端Chrome OS笔记本体验
      在笔记本电脑领域,Chromebook Pixel凭借其精致的铝合金外壳、细腻的显示屏和舒适的键盘,成为了外观设计的佼佼者。然而,尽管外观出众,它是否值得购买仍需考量。 ... [详细]
    • 本文介绍了如何使用命令行在 Windows 系统中启动或关闭 VMWare 的关键服务,包括 VMwareHostd、VMAuthdService、VMUSBArbService、VMware NAT Service 和 VMnetDHCP。 ... [详细]
    • 本文介绍并分享了三个个人开源项目,涵盖单元测试中HttpContext的可测试性增强、Visual Studio插件开发以及单元测试报告自动生成工具。 ... [详细]
    • 当您的笔记本电脑出现无法正常关机的情况时,可以通过多种方法进行排查和修复,包括检查声音文件、减少启动程序、调整电源管理设置等。 ... [详细]
    • 本文详细介绍了如何在两台运行 Windows Server 2003 的计算机上配置两个 MySQL 实例以实现主从复制。每台计算机分别命名为 Master 和 Slave,确保系统分区及 MySQL 安装路径的正确配置。 ... [详细]
    • 本文详细介绍了在Linux操作系统中安装和配置虚拟机的方法,包括选择合适的虚拟机软件、安装过程及基本配置步骤。 ... [详细]
    • 针对Win10系统中遇到的输入法无法正常切换的问题,本文提供了一套详细的解决步骤,帮助用户快速恢复输入法功能。 ... [详细]
    • 主板市盈率、市净率及股息率的自动化抓取
      本文介绍了如何通过Python脚本自动从中国指数有限公司网站抓取主板的市盈率、市净率和股息率等关键财务指标,并将这些数据存储到CSV文件中。涉及的技术包括网页解析、正则表达式以及异常处理。 ... [详细]
    • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
    • 解决ASP.NET Core在IIS中出现的502.5进程失败错误
      本文详细探讨了在Windows Server 2012环境下安装.NET Core后,IIS站点出现502.5错误的原因及解决方案,包括重启服务和系统的方法。 ... [详细]
    • 解决VSCode中文乱码问题的综合方案
      在使用VSCode进行开发时,尤其是涉及Python编程,可能会遇到中文乱码的问题。本文总结了多种有效的解决方案,帮助开发者快速解决这一常见问题。 ... [详细]
    • 本文详细介绍了在Delphi环境中对DLL文件进行断点调试的方法,包括设置依赖的可执行文件、编译器和链接器的调试选项,以及运行时参数的配置。 ... [详细]
    • 本文详细介绍了如何在 Windows 7 操作系统上安装和配置 InfluxDB,这是一种专为处理时间序列数据设计的高性能数据库。 ... [详细]
  • author-avatar
    2cz2x
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有