计算机图形学实验一:画直线

计算机图形学实验一:画直线
计算机图形学实验一:画直线

大学实验报告

学院:计算机科学与技术专业:计算机科学与技术班级:计科131

如果d>0,则M在理想直线上方,选正右方P2点;

如果d<0,则M在理想直线下方,选右上方P1点;

如果d=0,则M在理想直线上,选P1/ P2点。

由于d是xi和yi的线性函数,可采用增量计算提高运算效率。

1.如由pi点确定在是正右方P2点(d>0).,则新的中点M仅在x方向加1,新的d值为:

d new=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c

而d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c

d new=d old+a= d old-dy

2.如由pi点确定是右上方P1点(d<0),则新的中点M在x和y方向都增加1,新的d值为

d new=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c

而d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c

d new=d old+a+b= d old-dy+dx

在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。d的初始值: d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2 F(x0,y0)=0,(x0,y0)在直线上。

为了消除d的分数,重新定义F(x,y)=2(ax+by+c)

则每一步需要计算的d new 是简单的整数加法

dy=y1-y0,dx=x1-x0

d0=-2dy+dx

d new=d old-2*dy,当d old>=0

d new=d old-2(dy-dx),当d old<0

Bresenham画线算法

算法原理:

与DDA算

法相似,

Bresenham画线

算法也要在每

列象素中找到

与理想直线最

逼近的象素点。

根据直线

的斜率来确定

变量在x或y方

实验容#include"stdafx.h"

#include

#include

#include

#include

using namespace std;

void init()

{

glClearColor(1.0, 1.0, 1.0, 1.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0, 200.0, 0.0, 150.0);

}

void IntegerBresenhamline()

{

int x1 = 10, y1 = 10, x2 = 150, y2 = 100;

int dx = abs(x2 - x1);

int dy = abs(y2 - y1);

int x, y;

int e = -dx;

if (x1 > x2)

{

x = x2;

y = y2;

x2 = x1;

}

else{

x = x1;

y = y1;

}

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 0.0, 0.0);

glBegin(GL_LINES);

glVertex2i(x, y);

while (x < x2)

{

if (e >= 0)

{

y++;

e = e - 2 * dx;

}

glVertex2i(x, y);

x++; e += 2 * dy;

}

glEnd();

glFlush();

}

void MidPointLine()

{

int x, y, x1 = 10, y1 = 10, x2 = 150, y2 = 100;

int dy = y1 - y2;

int dx = x2 - x1;

int d = 2 * dy + dx;

int dx1 = 2 * dy;

int dx2 = 2 * (dx + dy);

if (x1 > x2)

{

x = x2;

y = y2;

x2 = x1;

}

else{

x = x1;

y = y1;

}

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 0.0, 0.0);

glBegin(GL_LINES);

glVertex2i(x, y);

while (x < x2)

{

if (d<0)

{

y++; x++;

d += dx2;

}

else

{

x++, d += dx1;

}

glVertex2i(x, y);

}

glEnd();

glFlush();

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowPosition(50, 100);

glutInitWindowSize(400, 300);

int choice;

printf("输入你想画的直线0代表Bresenham 1代表中点画线\n");

while (1)

{

scanf("%d", &choice);

switch (choice)

{

case 0:

glutCreateWindow("Bresenham Draw Line");

init();

glutDisplayFunc(IntegerBresenhamline);

glutMainLoop();

break;

case 1:

glutCreateWindow("middle Point Line");

init();

glutDisplayFunc(MidPointLine);

glFlush();

glutMainLoop();

break;

default:

printf("输入有误,请重新输入\n");

break;

}

}

return 0;

}

实验结果

验总结

通过这次试验我对于中点生成算法和Bresenham生成算法有了进一步的了解,在平时上课的基础上对计算机图形学有了更深的认识,同时对课程容也更加了解。

见签名:年月日

相关主题
相关文档
最新文档