DDA算法实现
DDA算法和Bresenham算法是计算机图形学中绘制直线的两种常用算法。本文具体介绍一下DDA算法和Bresenham算法实现的具体思路。DDA算法主要是根据直线公式y = kx + b来推导出来的,其关键之处在于如何设定单位步进,即一个方向的步进为单位步进,另一个方向的步进必然是小于1。算法的具体思路如下:
1. 输入直线的起点、终点;
2. 计算x方向的间距:△X和y方向的间距:△Y。
3. 确定单位步进,取MaxSteps = max(△X,△Y); 若△X>=△Y,则X方向的步进为单位步进,X方向步进一个单位,Y方向步进△Y/MaxSteps;否则相反。
4. 设置第一个点的像素值
5. 令循环初始值为1,循环次数为MaxSteps,定义变量x,y,执行以下计算:
a. x增加一个单位步进,y增加一个单位步进
b. 设置位置为(x,y)的像素值
代码:
#include <GL/glut.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int color[3];
int wideth=0;
void LineDDA(int x0, int y0, int x1, int y1,int color[])
{
int x, dy, dx, y;
float m;
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
y=y0;
glColor3f (color[2]*1.0f, color[1]*1.0f, color[0]*1.0f);
glPointSize(wideth);
for(x=x0;x<=x1;x++)
{
glBegin (GL_POINTS);
glVertex2i (x, (int) (y+0.5));
glEnd ();
y+=m;
}
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (color[2]*1.0f, color[1]*1.0f, color[0]*1.0f);
glRectf (25.0, 25.0, 75.0, 75.0);
glPointSize(5.0f);
glBegin (GL_POINTS);
glColor3f (color[2]*1.0f, color[1]*1.0f, color[0]*1.0f);
glVertex2f(100.0f,200.0f);
glEnd ();
LineDDA (0, 0, 200, 300,color);
glBegin (GL_LINES);
glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (100.0f, 0.0f);
glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (180.0f, 240.0f);
glEnd ();
glFlush ();
}
void Init()
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void Reshape (int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);
}
void select()
{
printf("选择1~7分别为如下颜色");
printf("画线颜色定义如下:\n");
printf(" 蓝 绿 青 红 黄 玫瑰 白\n");
printf("1(001) 2(010) 3(011) 4(100) 5(101) 6(110) 7(111)\n");
printf("Select[1~7]:\n");
int cr;
scanf("%d",&cr);
int i=0;
memset(color,0,sizeof(color));
while(cr)
{
color[i++]=cr%2;
cr/=2;
}
printf("Plese select the line's wideth:\n");
scanf("%d",&wideth);
wideth*=1.0;
}
int main (int argc, char *argv[])
{
select();
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition (100,100);
glutInitWindowSize (400, 400);
glutCreateWindow("OpenGL 2!");
Init();
glutDisplayFunc (myDisplay);
glutReshapeFunc (Reshape);
glutMainLoop ();
return 0;
}