计算机图形学 实验2 《绘制抛物线和正弦曲线》
一、实验目的
学习图形数据的计算、存储和图形绘制。
二、实验内容
1、计算抛物线和正弦曲线,将结果存放在一个数组中;
2、 用OpenGL函数绘制相应的图形。
三、实验方法
使用OpenGL提供的GL_LINE_STRIP绘制模式,不断根据抛物线和正弦曲线函数绘制点,通过GL_LINE_STRIP模式将点连起来形成抛物线和正弦曲线。
四、实验步骤
基本流程和实验1类似,此次绘制仍然在display
函数中进行,使用的都是GL_LINE_STRIP模式进行绘制:
1、先在init
函数中将较多的曲线上的点计算出来并且存入数组;
2、在display
函数中通过GL_LINE_STRIP模式(将点两两之间连接起来)循环使用glVertex2d
函数打点,近似形成目标曲线。
五、实验结果与实验结论
GL_LINE_STRIP模式有一定的限制,点的数目超过一定量之后对形成的曲线的毛边、锯齿的消除效果有限,如本次实验中笔者发现采用2000个点和20000个点画出来的效果区别很小。
1、绘制抛物线:
关键源码:
void init() {
double x = -1;
for (int i = 0; i < 2000; i++, x += 0.001) {
// 抛物线
parabolic[i][0] = x;
parabolic[i][1] = 2.5 * x * x - 0.7;
// 正弦曲线
sinecurve[i][0] = x;
sinecurve[i][1] = 0.3 * sin(4 * x * PI);
}
}
void display(void) {
init();
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//执行清除窗口的指令
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < 2000; i++) {
glVertex2d(parabolic[i][0], parabolic[i][1]);
}
glEnd();
glFlush();//将缓冲区的内容刷新到屏幕上进行显示
}
2、绘制正弦曲线:
关键源码:
void display(void) {
init();
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//执行清除窗口(缓冲区)的指令
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < 2000; i++) {
glVertex2d(sinecurve[i][0], sinecurve[i][1]);
}
glEnd();
glFlush();//将缓冲区的内容刷新到屏幕上进行显示
}
六、实验小结
一开始并不知道实验怎么做,因为自己对指定曲线的绘制不是很了解,在网上查阅了很多资料之后了解到有GL_LINE_STRIP这个模式可以将相邻的点连起来,因此考虑使用足够多的点来拟合形成曲线。
但是做到后面发现拟合的效果不太行,曲线不怎么光滑,毕竟是由很多条折线形成的曲线,因此考虑把每个点之间的间隔距离减小,增加点的个数,拟合效果比之前好很多,但是优化也有上限,点的个数超过上限之后再增加就没有更进一步的优化效果了。