MENU

计算机图形学(0)

April 9, 2020 • 阅读: 1074 • 笔记&折腾



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命令
}

Last Modified: February 6, 2021