codeblocks 配置 OpenGL 环境
VS配置OpenGL环境
第一个程序,绘制一个填充的白色矩形:
#include <windows.h>
#include <GL/glut.h>
void Paint(){
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲区
glRectf(-0.8,-0.6,0.8,0.6); //定义矩形(-0.8,-0.6)~(0.8,0.6)
glFlush(); //强制OPENGL命令序列在有限时间内完成执行
}
int main(){
//设置程序窗口的显示模式(单缓存,RGBA颜色模式,默认值)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100); //设置程序窗口在屏幕上的位置
glutInitWindowSize(200,200); //设置程序窗口的大小
glutCreateWindow("First OpenGL!"); //设置窗口标题
glutDisplayFunc(Paint); //指定场景绘制循环函数,必须
glutMainLoop(); //开始循环执行OpenGL命令
}
效果:
DDA算法
#include <windows.h>
#include <GL/glut.h>
#include <math.h>
void dda_line(int xa,int ya,int xb,int yb)
{
float delta_x,delta_y,x,y;
int dx,dy,steps;
dx=xb-xa;
dy=yb-ya;
if(abs(dx)>abs(dy))
steps=abs(dx);
else
steps=abs(dy);
delta_x=(float)dx/(float)steps;
delta_y=(float)dy/(float)steps;
x=xa;
y=ya;
glClear(GL_COLOR_BUFFER_BIT); //清除缓存
glBegin(GL_POINTS); //开始绘制
glVertex3f(x,y,0);
for(int k=1;k<=steps;k++)
{
x+=delta_x;
y+=delta_y;
glBegin(GL_POINTS);
glVertex3f(x,y,0);
glEnd();
}
}
void Paint(){
glClearColor(1, 1, 1, 1); //设置背景为白色
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲区
glColor3f(1.0, 0.0, 0.0); //设置绘制颜色
glPointSize(3.5f); //设置点大小
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);
dda_line(20,20,400,400);
glFlush(); //强制OPENGL命令序列在有限时间内完成执行
}
int main(int argc, char* argv[]){
glutInit(&argc, argv); //初始化
//设置程序窗口的显示模式(单缓存,RGBA颜色模式,默认值)
//glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100); //设置程序窗口在屏幕上的位置
glutInitWindowSize(500,500); //设置程序窗口的大小
glutCreateWindow("DDA"); //设置窗口标题
glutDisplayFunc(Paint); //指定场景绘制循环函数,必须
glutMainLoop(); //开始循环执行OpenGL命令
}
注:
glMatrixMode()
glMatrixMode() 的参数是对下一步要做什么的声明,参数有三个:
- GL_PROJECTION 投影
- GL_MODELVIEW 模型视图
- GL_TEXTURE 纹理
gluOrtho2D()
gluOrtho2D是用来指定屏幕区域对应的模型坐标范围,我们自己所绘制的图形的坐标必须在这个范围内,不然不能看到自己绘制的图形。
glLoadIdentity
对当前矩阵进行初始化 ,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态。
中心画线算法
#include <windows.h>
#include <GL/glut.h>
#include <math.h>
void center_Line(int xa,int ya,int xb,int yb){
int dx = xa;
int dy = ya;
int a = ya - yb; //计算 a
int b = xb - xa; //计算 b
int d0 = 2*a+b; //d 的初始值
int d1 = 2*a; // 当 d <0 时的增量
int d2 = 2*(a+b); // 当 d >0 时的增量
glClear(GL_COLOR_BUFFER_BIT); //清除缓存
glBegin(GL_POINTS); //开始绘制
for(;dx<=xb;dx++){
glBegin(GL_POINTS);
glVertex3f(dx,dy,0);
glEnd();
if(d0<0){
dy++;
d0+=d2;
}else{
d0+=d1;
}
}
}
void Paint(){
glClearColor(1, 1, 1, 1); //设置背景为白色
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲区
glColor3f(1.0, 0.0, 0.0); //设置绘制颜色
glPointSize(3.5f); //设置点大小
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);
center_Line(30,20,400,300);
//dda_line(20,20,400,400);
glFlush(); //强制OPENGL命令序列在有限时间内完成执行
}
int main(int argc, char* argv[]){
glutInit(&argc, argv); //初始化
//设置程序窗口的显示模式(单缓存,RGBA颜色模式,默认值)
//glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100); //设置程序窗口在屏幕上的位置
glutInitWindowSize(500,500); //设置程序窗口的大小
glutCreateWindow("DDA"); //设置窗口标题
glutDisplayFunc(Paint); //指定场景绘制循环函数,必须
glutMainLoop(); //开始循环执行OpenGL命令
}