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

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大学实验报告

学院:计算机科学与技术专业:计算机科学与技术班级:计科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)

相关文档
最新文档