实验2《绘制抛物线和正弦曲线》
一、实验目的
学习图形数据的计算、存储和图形绘制。
二、实验内容
1. 计算抛物线和正弦曲线,将结果存放在一个数组中;
2. 用OpenGL函数绘制相应的图形。
(一)抛物线
运行结果
输入a,b的值,根据抛物线生成图像。
改变窗口大小,改变抛物线形状。
(二)正弦曲线
运行结果
运行程序,显示抛物线。
源代码
(一)抛物线
#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int a = 9, b = 1; //参数
void init() {
glClearColor(0.5f, 0.0f, 0.0f, 0.0f); //设置窗口背景颜色
glMatrixMode(GL_PROJECTION); //设置投影参数
gluOrtho2D(-200.0, 200.0, -100.0, 100.0); //投影面上的模型坐标范围
}
//抛物线:Bresenham算法
void parabola(int a, int b) {
int x, y;
float d1, d2;
int x0, y0;
x = 0, y = 0;
d1 = a * (x + 0.5) - b * (y + 1) * (y + 1);
glEnable(GL_LINE_SMOOTH); //使用反走样
glEnable (GL_BLEND); //启用混合函数
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //指定混合函数
glLineWidth(1.5f);
glBegin(GL_LINE_STRIP);
glVertex2i(0, 0);
//下半部分
while (y < 0.5 * a / b) {
if (d1 <= 0) {
d1 += a - (2 * y + 3) * b;
y++;
x++;
} else {
d1 -= (2 * y + 3) * b;
y++;
}
glVertex2i(x, y);
}
x0 = x;
y0 = y; //保存x,y
//上半部分
d2 = a / 2 - b / 4;
while (x < 1000) {
if (d2 <= 0) {
d2 += a;
x++;
} else {
d2 += a - (2 * y + 2) * b;
x++;
y++;
}
glVertex2i(x, y);
}
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2i(0, 0);
glVertex2i(0, -0);
x = 0, y = 0;
d1 = a * (x + 0.5) - b * (y + 1) * (y + 1);
while (y < 0.5 * a / b) {
if (d1 <= 0) {
d1 += a - (2 * y + 3) * b;
y++;
x++;
} else {
d1 -= (2 * y + 3) * b;
y++;
}
glVertex2i(x, -y);
}
x = x0;
y = y0;
d2 = a / 2 - b / 4;
while (x < 1000) {
if (d2 <= 0) {
d2 += a;
x++;
} else {
d2 += a - (2 * y + 2) * b;
x++;
y++;
}
glVertex2i(x, -y);
}
glEnd();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);
parabola(a, b);
glFlush();
}
int main(int argc, char* argv[]) {
cout<< "抛物线:a*x = b*y^2" <<endl;
cout << "输入a, b值:" << endl;
cin >> a >> b;
cout<<"抛物线为"<<a<<"*x="<<b<<"*y^2"<<endl;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition(400, 400);
glutCreateWindow("2抛物线");
glutDisplayFunc(display);
init();
glutMainLoop();
return 0;
}
(二)正弦曲线
源代码
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
const GLfloat factor = 0.3f;
void init() {
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-200.0, 200.0, -100.0, 100.0); // 投影面上的模型坐标范围
}
void DrawCoordinatesAxis () {
glLineWidth(1);
glBegin(GL_LINES);
glVertex2f(-1.0f, 0.0f); //坐标轴
glVertex2f(1.0f, 0.0f);
glVertex2f(0.0f, -1.0f);
glVertex2f(0.0f, 1.0f);
glEnd();
}
void DrawSineCure() {
glLineWidth(2);
glEnable(GL_LINE_SMOOTH); //使用反走样
glEnable (GL_BLEND); //启用混合函数
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //指定混合函数
glLineWidth(1.5f);
glBegin(GL_LINE_STRIP);
GLfloat x;
//glBegin(GL_LINE_STRIP);
for (x = -1.0f / factor; x < 1.0f / factor; x += 0.001f) {
glVertex2f(x * factor, sin(x)*factor);
}
glEnd();
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
DrawCoordinatesAxis();
DrawSineCure();
glFlush();
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition(200, 200);
glutCreateWindow("2正弦曲线");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}