计算机图形学实验一:画直线
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)