计算机图形学实战——Bresenham直线光栅化算法绘制旋转线
#include <GL/glut.h>#include<iostream>#include<math.h>using namespace std;GLfloat pointsize = 1.0f;void init(void){glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色为黑色glShadeMo...
·
#include <GL/glut.h>
#include<iostream>
#include<math.h>
using namespace std;
GLfloat pointsize = 1.0f;
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色为黑色
glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
gluOrtho2D(-200.0, 200.0, -200.0, 200.0);///*设定映射区域,参数为(minX,maxX,minY,maxY),(minX,minY为原点);(maxX, maxY)为右上角的点* /
}
double D2R(double deg) {
return deg / 180.0 * 3.14159265;
}
void Bresenham_drawOneLine(GLint xs, GLint ys, GLint xe, GLint ye) {
GLint x = xs;
GLint y = ys;
int flag;//用以表示是否发生了交换
GLint dx = abs(xe - xs);
GLint dy = abs(ye - ys);
GLint sx = ((xe > xs)?1:-1);
GLint sy = ((ye > ys)?1:-1);
if (dy > dx)
{
swap(dx, dy);
flag = 1;
}
else
{
flag = 0;
}
cout << flag;
GLfloat Nerror =2*dy - dx;//开始在光栅点处,d=0,下一个点处d=k
for (int i = 1; i < dx; i++)
{
glBegin(GL_LINES);
glColor3f(1.0f, 0.0f, 0.0f);
//cout << x << y << endl;
glVertex2i(x, y);
if (Nerror>=0)
{
if (flag)
{
x = x + sx;
}
else
{
y = y + sy;
}
Nerror = Nerror - 2*dx;
}
if (flag)
{
y = y + sy;
}
else
{
x = x + sx;
}
Nerror = Nerror + 2*dy;
}
glEnd();//结束
glFlush();
/*OpenGL指令不是立即执行的。它们首先被送到指令缓冲区,然后才被送到硬件执行。
glFlush都是强制将命令缓冲区的内容提交给硬件执行。*/
}
void Bresenham_Rotationline()
{
glClear(GL_COLOR_BUFFER_BIT); //清除所有的像素
glEnable(GL_LINE_STIPPLE); //点画线模式
float t = 0;
glColor3f(1.0, 0.0, 0.0); //使用红色绘制该线段
for (double i = 0; i <=360; i =i+5)
{
cout << i << endl;
Bresenham_drawOneLine(0, 0, 100*cos(D2R(i)), 100*sin(D2R(i)));
}
//Bresenham_drawOneLine(0, 0,-50, -100);
//Bresenham_drawOneLine(200, 200, 0, 0);
//Bresenham_drawOneLine(-200, -200, 0, 0);
//Bresenham_drawOneLine(200,- 200, 0, 0);
glFlush();
}
int main(int argc, char ** argv)
{
/*初始化*/
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//单缓冲、RGB模式
glutInitWindowSize(400, 400);
glutInitWindowPosition(200, 200);
glutCreateWindow("Bresenham直线光栅化算法");//窗口标题
init();
/*绘制与显示*/
//glutReshapeFunc(myReshape);//窗口大小发生改变时采取的行为
glutDisplayFunc(Bresenham_Rotationline);//将图传递给显示窗口,参数是描述的一个程序,即调用这个函数再送到显示窗口
glutMainLoop();//循环
return(0);//去掉这个函数,程序窗口一打开就马上关闭了
}

加上颜色之后的版本为
#include <GL/glut.h>
#include<iostream>
#include<math.h>
using namespace std;
GLfloat pointsize = 1.0f;
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色为黑色
glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
gluOrtho2D(-200.0, 200.0, -200.0, 200.0);///*设定映射区域,参数为(minX,maxX,minY,maxY),(minX,minY为原点);(maxX, maxY)为右上角的点* /
}
double D2R(double deg) {
return deg / 180.0 * 3.14159265;
}
void Bresenham_drawOneLine(GLint xs, GLint ys, GLint xe, GLint ye) {
GLint x = xs;
GLint y = ys;
int flag;//用以表示是否发生了交换
GLint dx = abs(xe - xs);
GLint dy = abs(ye - ys);
GLint sx = ((xe > xs)?1:-1);
GLint sy = ((ye > ys)?1:-1);
if (dy > dx)
{
swap(dx, dy);
flag = 1;
}
else
{
flag = 0;
}
cout << flag;
GLfloat Nerror =2*dy - dx;//开始在光栅点处,d=0,下一个点处d=k
for (int i = 1; i < dx; i++)
{
glBegin(GL_LINES);
//glColor3f(1.0f, 0.0f, 0.0f);
//cout << x << y << endl;
glVertex2i(x, y);
if (Nerror>=0)
{
if (flag)
{
x = x + sx;
}
else
{
y = y + sy;
}
Nerror = Nerror - 2*dx;
}
if (flag)
{
y = y + sy;
}
else
{
x = x + sx;
}
Nerror = Nerror + 2*dy;
}
glEnd();//结束
glFlush();
/*OpenGL指令不是立即执行的。它们首先被送到指令缓冲区,然后才被送到硬件执行。
glFlush都是强制将命令缓冲区的内容提交给硬件执行。*/
}
void Bresenham_Rotationline()
{
glClear(GL_COLOR_BUFFER_BIT); //清除所有的像素
glEnable(GL_LINE_STIPPLE); //点画线模式
float t = 0;
//glColor3f(1.0, 0.0, 0.0); //使用红色绘制该线段
for (double i = 0; i <=360; i =i+5)
{ if (0<=i&&i<=45)
glColor3f(1.0, 0.0, 0.0);
else if(45<i&&i<=90)
glColor3f(0.0, 1.0, 1.0);
else if (90 < i&&i <=135)
glColor3f(1.0, 1.0, 1.0);
else if (135 < i&&i <=180)
glColor3f(1.0, 0.6, 0.4);
else if (180 < i&&i <=225)
glColor3f(1.0, 1.0, 0.9);
else if (225 < i&&i <=270)
glColor3f(0.2, 0.6, 0.5);
else if (270 < i&&i <=315)
glColor3f(1.0, 0.7, 1.0);
else
glColor3f(0.5, 0.5, 0.5);
cout << i << endl;
Bresenham_drawOneLine(0, 0, 150*cos(D2R(i)), 150*sin(D2R(i)));
}
//Bresenham_drawOneLine(0, 0,-50, -100);
//Bresenham_drawOneLine(200, 200, 0, 0);
//Bresenham_drawOneLine(-200, -200, 0, 0);
//Bresenham_drawOneLine(200,- 200, 0, 0);
glFlush();
}
int main(int argc, char ** argv)
{
/*初始化*/
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//单缓冲、RGB模式
glutInitWindowSize(400, 400);
glutInitWindowPosition(200, 200);
glutCreateWindow("Bresenham直线光栅化算法");//窗口标题
init();
/*绘制与显示*/
//glutReshapeFunc(myReshape);//窗口大小发生改变时采取的行为
glutDisplayFunc(Bresenham_Rotationline);//将图传递给显示窗口,参数是描述的一个程序,即调用这个函数再送到显示窗口
glutMainLoop();//循环
return(0);//去掉这个函数,程序窗口一打开就马上关闭了
}

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)