计算机图形学基础实验二(DDA算法实现 稍加控制)

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值