OpenGL绘制贝塞尔曲线的方法

  介绍

这篇文章主要讲解了OpenGL绘制贝塞尔曲线的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

最终效果图:

通过3个点形成一条贝塞尔曲线

 OpenGL绘制贝塞尔曲线的方法

<强> 1。鼠标问题

在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的;

openGL使用右手坐标
从左到右,x递增
从下到上,y递增
从远到近,z递增

而鼠标是从左到右增x,同时从上到下也是增y

所以在求y的时候,用(屏幕大小- y)来获取

<强> 2。绘制

选点用来绘制点
setline用来绘制线
setBezier用来绘制贝塞尔曲线

其中公式的意义可以参考百科:

 OpenGL绘制贝塞尔曲线的方法

实际绘制的时候就是不断的增加t,求出下一点的值然后将两个链接起来,然后再将下一个点作为起点,再求出下下一个点

Api解释在代码中

 # include“GL \ glut.h"
  # include & lt; math.h>
  # include & lt; Windows.h>//这是一个点的类,用于存储其中点的坐标
  类点
  {
  公众:
  int x, y;
  空白setxy (int值,int _y吗){
  x=值;
  y=_y吗;
  }
  };//点的数量
  静态int POINTSNUM=0;//用于存储点的集合,因为绘制的都是4个点的贝塞尔曲线,所以数组大小为4
  静态点分[4];//初始化函数
  空白init(空白)
  {
  glClearColor (1.0, 1.0, 1.0, 0);//设定背景为黑色
  glColor3f (0.0, 0.0, 0.0);//绘图颜色为白色
  glPointSize (2.0);//设定点的大小为2 * 2像素的
  glMatrixMode (GL_PROJECTION);//设定合适的矩阵
  glLoadIdentity ();//是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态
  gluOrtho2D (0.0,600.0, 0.0,480.0);//平行投影,四个参数分别是x, y范围
  }//绘制点
  空白定位点(点p) {
  glBegin (GL_POINTS);
  glVertex2f (p。x, p.y);
  glEnd ();
  glFlush ();
  }//绘制直线
  空白setline (p1, p2) {
  glBegin (GL_LINES);
  glVertex2f (p1.x p1.y);
  glVertex2f (p2。x, p2.y);
  glEnd ();
  glFlush ();
  }//绘制贝塞尔曲线
  点setBezier (p1, p2, p3, p4,双t) {
  点p;
  双a1=战俘((1 - t), 3);
  双a2=战俘((1 - t) 2) * 3 * t;
  双a3=3 * t * t * (1 - t);
  双a4=t * t * t;
  p。x=a1 * p1。x + a2 * p2。x + a3 * p3。x + a4 * p4.x;
  p。y=a1 * p1。y + a2 * p2。y + a3 * p3。y + a4 * p4.y;
  返回p;
  }//显示函数
  空白显示()
  {
  glClear (GL_COLOR_BUFFER_BIT);
  glFlush ();
  }//鼠标事件
  空白mymouseFunction (int按钮,int, int x, int y) {
  如果(状态==GLUT_DOWN)//如果鼠标按下,不区分左右键的
  {
  点[POINTSNUM]。setxy (x, 480 - y);//这里求鼠标点的坐标的时候//设置点的颜色,绘制点
  glColor3f (1.0, 0.0, 0.0);
  选点[POINTSNUM](点);//设置线的颜色,绘制线
  glColor3f (1.0, 0.0, 0.0);
  如果(POINTSNUM比;0)setline(点(POINTSNUM-1),点[POINTSNUM]);//如果达到了4个绘制贝塞尔曲线,并在之后给计数器清零
  如果(POINTSNUM==3) {//绘制贝塞尔曲线
  glColor3f (0.0, 0.0, 1.0);//设定贝塞尔曲线的颜色
  
  点p_current=点[0];//设为起点
  (双t=0.0;t & lt;=1.0;t +=0.05)
  {
  点P=setBezier(点[0],[1],分[2],[3],t);
  setline (p_current, P);
  p_current=P;
  }
  
  POINTSNUM=0;
  }
  其他=POINTSNUM + +;
  }
  }
  }
  
  int主要(int命令行参数个数,char * argv [])
  {
  glutInit(和命令行参数个数,argv);//固定格式
  glutInitDisplayMode (GLUT_RGB | GLUT_SINGLE);//缓存模式
  glutInitWindowSize (600、480);//显示框的大小
  glutInitWindowPosition (100、100);//确定显示框左上角的位置
  glutCreateWindow(“第四次作业“);
  
  init ();//初始化
  glutMouseFunc (mymouseFunction);//添加鼠标事件
  glutDisplayFunc(显示);//执行显示
  glutMainLoop ();//进人过剩事件处理循环
  返回0;
  }

看完上述内容,是不是对OpenGL绘制贝塞尔曲线的方法有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。

OpenGL绘制贝塞尔曲线的方法