介绍
这篇文章主要讲解了OpenGL绘制贝塞尔曲线的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
最终效果图:
通过3个点形成一条贝塞尔曲线
<强> 1。鼠标问题强>
在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的;
openGL使用右手坐标
引用>
从左到右,x递增
从下到上,y递增
从远到近,z递增而鼠标是从左到右增x,同时从上到下也是增y
所以在求y的时候,用(屏幕大小- y)来获取
<强> 2。绘制强>
选点用来绘制点
setline用来绘制线
setBezier用来绘制贝塞尔曲线其中公式的意义可以参考百科:
![]()
实际绘制的时候就是不断的增加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绘制贝塞尔曲线的方法