利用求值器绘制三次Bezier曲线
来源:互联网 发布:软件测试脚本 编辑:程序博客网 时间:2024/05/18 08:14
在第一篇文章中我顶点与 Bernstein基函数绘制了三次Bezier曲线,正准备用同样的方法绘制双三次Bezier曲面,突然发现不行,好像和matlab不是很一样,网上找到了一段代码,发现要先学习求值器,对于一维曲线,主要涉及到的有这么两个函数
glMap1以及glEvalCoord1
为此,我专门查阅了一下opengl网站上关于glmap1的段落
https://www.opengl.org/sdk/docs/man2/xhtml/glMap1.xml
比较有用的摘录如下
void glMap1f(
GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points)
;
其参数
target指定了由求值器产生的值的类型,可以被接受的类型为
GL_MAP1_VERTEX_3
, GL_MAP1_VERTEX_4
, GL_MAP1_INDEX
, GL_MAP1_COLOR_4
, GL_MAP1_NORMAL
, GL_MAP1_TEXTURE_COORD_1
,GL_MAP1_TEXTURE_COORD_2
, GL_MAP1_TEXTURE_COORD_3
, and GL_MAP1_TEXTURE_COORD_4
GL_MAP1_VERTEX_3
每个控制点都是由三个float组成,分别代表x,y,z值
u1,u2是限定了变量U的取值范围,通常是从0变化到1。
stride:表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量)。
order:阶数,等于次数加1,与控制点数相等。
void glEvalCoord1f(
GLfloat u)
;
u为在glmap1函数中提到的值
具体实现的代码如下
#include <GL/glut.h>#include <stdio.h>#include<Windows.h>#include <stdlib.h>GLfloat ctrlpoints[4][3] = {{ -0.8f, 0.1f, 0.0 }, { -0.4f, 0.6f, 0.0 },{ 0.2f, 0.8f, 0.0 }, { 0.7f, 0.2f ,0.0} };void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);glEnable(GL_MAP1_VERTEX_3);glColor3f(1.0, 1.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i <= 10; i++)glEvalCoord1f((GLfloat)i / 10.0);glEnd();glDisable(GL_MAP1_VERTEX_3);/* The following code displays the control points as dots. */glPointSize(5.0);glColor3f(1.0, 1.0, 0.0);glBegin(GL_POINTS);for (int i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glColor3f(0.0, 1.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i < 4; i++){glVertex3fv(&ctrlpoints[i][0]);}glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}
其中主要用来绘制Bezier曲线的代码部分其实很短
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);glEnable(GL_MAP1_VERTEX_3);glColor3f(1.0, 1.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i <= 10; i++)glEvalCoord1f((GLfloat)i / 10.0);glEnd();glDisable(GL_MAP1_VERTEX_3);只有这么一段
其中i表示分为几段表示曲线,我的理解就是通过前面的函数其实就已经计算好了这一整条B曲线,然后通过后面这个函数输入想要绘制出来的点,就可以计算得出整条曲线了,最后放上最后效果。
- 利用求值器绘制三次Bezier曲线
- 利用求值器绘制双三次Bezier曲面
- 使用基本Bezier求值器绘制曲线和曲面
- 利用MATLAB绘制Bezier曲线
- OpenGL: 鼠标动态绘制三次Bezier曲线
- 计算机图形学-三次Bezier曲线的绘制
- 利用de Casteljau算法绘制Bezier曲线
- 利用de Casteljau算法绘制Bezier曲线
- 不用求值器绘制双二次及双三次Bezier曲面
- 三次Bezier曲线
- OpenGL 三次Bezier曲线
- OpenGL下通过鼠标动态绘制三次Bezier曲线
- OpenGL下通过鼠标动态绘制三次Bezier曲线 .
- OpenGL: OpenGL下通过鼠标动态绘制三次Bezier曲线
- 开始学习opengl以及绘制三次Bezier曲线
- 绘制贝塞尔Bezier曲线
- Bezier曲线的绘制
- Bezier曲线的绘制
- fork与wait的使用
- 用android虚拟机,向sdcard导入文件时候报错 transfer error: Read-only file system
- NodeJS mysql2 使用心得
- VS2010 MFC Excel(3)
- ACM第二专题—搜索总结
- 利用求值器绘制三次Bezier曲线
- 红黑树并没有我们想象的那么难(下)
- HashMap学习
- 插入排序
- ACM--贪心--FZU--2111--Min Number
- Makefile经典教程(掌握这些足够)
- 堆排序
- 指针数组和数组指针的内存布局
- Spring 代码中执行事务回滚