计算机图形上机作业

发布 2022-08-23 23:28:28 阅读 6148

实验一开发环境的使用及直线的生成。

实验目的:直线的生成是用计算机生成图形最基本的技能,通过本实验使学生掌握如何用计算机生成直线。熟悉开发环境,生成直线。

实验要求:(1)熟悉turbo c开发环境。

2)分别用dda算法、bresenham算法生成直线。

实验原理:一、 直线的dda算法。

设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得:

1)设第i个坐标点为,可通过计算由x方向的增量△x引起y的改变来生成直线,当x方向的步进值为1时,则,选取最接近的像素点作为直线的下一个坐标。

2)也可通过计算由y方向的增量△y引起x的改变来生成直线。

当y方向的步进值为1时,则,选取最接近的坐标点作为直线的下一个坐标。

以此类推,直到达到终点(x2,y2)为止,从而利用dda算法实现线段的绘制。

二、 bresenham算法画直线:

设直线从起点(x1, y1)到终点(x2, y2),设直线方程为:y=kx+b

其中b = y1 - k * x1,

根据dda算法的讨论有:

在1a象限里,即且,时,当直线光栅化时,x每次都增加1个单元:,y每次都增加k,由于k不一定是整数,因此由(2)式求出的y也不一定是整数。所以要用最靠近y的整数来代替y,假设直线上第i个像素坐标为(xi,yi),那么,它的下一个点的像素点的可能位置为(xi+1,yi)或(xi+1,yi+1)。

如图1所示:

图1 直线和像素坐标位置关系。

如上图在x=xi+1处,直线上y的值y=k(xi+1)+b,该点距离点(xi+1,yi)和点(xi+1,yi+1)的距离分别为d1和d2,其中。

a. 当d1-d2>0时,说明直线上的理论点距离(xi+1,yi+1) 较近,因此下一个直线像素点应取(xi+1,yi+1)。

b. 当d1-d2<0时,说明直线上的理论点距离(xi+1,yi)较近,因此下一个直线像素点应取(xi+1,yi)。

c. 当d1-d2=0时,说明直线上的理论点距离上、下两个像素点的距离相等,因此规定取(xi+1,yi+1)作为下一个直线像素点。

因此,利用(d1-d2)的符号就可以决定下一个像素点的选择。

然而含有变量xi、yi,不利于计算。为此,我们构造一个新的判别式:

其中,,当时,和同号。

以i+1代入式(2)中的i,得:

4)-(3)可得: 所以:

当时,, 当时,, 其中。

同理可得直线斜率在其他范围时的递推关系式!

第1a象限内的直线bresenham算法思想如下:

假设线段起点为(x1, y1),终点为(x2,y2)

1.画点(x1, y1); dx=x2-x1; dy=y2-y1;计算误差初值p1=2dy-dx; i=1;

2.求直线的下一点位置:xi+1=xi+1;if pi>0 则yi+1=yi+1;否则yi+1=yi;

3.画点(xi+1, yi+1);

4.求下一个误差pi+1;if pi>0 则pi+1=pi+2dy-2dx;否则pi+1=pi+2dy;

5.然后根据pi+1的符号,再求yi+2的坐标,依次类推,直到到达终点(x2,y2)。

实验步骤:1. 打开turbo c编程环境。

2. 编程实现dda算法和bresenham算法画直线。

3. 算法示例:

1) dda算法画直线:

#include ""

#include ""

#include ""

#define round(x) (int)((x>=0)?(x+0.5):(x-0.5)))

void setpixel(int x,int y)

putpixel(x,y,4);

putpixel(x,y+1,4);

putpixel(x,y-1,4);

putpixel(x-1,y,4);

putpixel(x-1,y+1,4);

putpixel(x-1,y-1,4);

putpixel(x+1,y,4);

putpixel(x+1,y-1,4);

putpixel(x+1,y+1,4);

ddaline(int x1,int y1,int x2,int y2)

float x=1+3*x1,y=1+3*y1;

int z;

float k;

if(x1==x2)else

elseif(k<=1&&k>=-1&&x2

if(k>1&&y2>=y1)

if(k>1&&y2

if(k<-1&&y2>=y1)

if(k<-1&&y2

void main()

int driver=vga;

int dmode=vgahi;

int x1,y1,x2,y2;

int gdriver=detect,gmode;

registerbgidriver(eg**ga_driver);

initgraph(&driver,&dmode,"g:\\tc\\project");

printf("input the start point:");

printf("x1=")

scanf("%d",&x1);

printf("y1=")

scanf("%d",&y1);

printf("input the end point:");

printf("x2=")

scanf("%d",&x2);

printf("y2=")

scanf("%d",&y2);

ddaline(x1,y1,x2,y2);

getch();

2) bresenham算法画直线:

#include <>

#include <>

#include<>

#include<>

void swap(int* m,int* n)

int t;

t=*m;m=*n;

n=t;void bresenhamline(int x0,int y0,int x1,int y1,int color)

int x,y,dx,dy,p,same,change;

if(x0==x1)

if(y0>y1)

swap(&y0,&y1);

x=x0,y=y0;

for(;yputpixel(x,y,color);

return;

if(x0>x1)

swap(&x0,&x1);

swap(&y0,&y1);

dx=x1-x0;

dy=y1-y0;

if(0<=dy&&dy<=dx)

p=dy<<1-dx,same=dy<<1,change=(dy-dx)<<1,x=x0,y=y0;

for(;x{

putpixel(x,y,color);

if(p<0)

p+=same;

elsep+=change;

y++;return;

else if(-dx<=dy&&dy<0)

p=-dx-dy<<1,same=-dy<<1,change=(-dy-dx)<<1,x=x0,y=y0;

for(;x{

putpixel(x,y,color);

if(p<0)

p+=same;

elsep+=change;

y--;return;

else if(dx{

if(y0>y1)

swap(&x0,&x1);

swap(&y0,&y1);

dx=x1-x0;

dy=y1-y0;

p=dx<<1-dy,same=dx<<1,change=(dx-dy)<<1,x=x0,y=y0;

for(;y{

putpixel(x,y,color);

if(p<0)

p+=same;

elsep+=change;

x++;return;

elseif(y0>y1)

swap(&x0,&x1);

swap(&y0,&y1);

dx=x1-x0;

dy=y1-y0;

p=-dx*2-dy,same=-dx*2,change=-(dx+dy)*2,x=x0,y=y0;

for(;y{

putpixel(x,y,color);

if(p<0)

p+=same;

elsep+=change;

x--;return;

main()

int driver=vga;

int dmode=vgahi;

int x0,y0,x1,y1;

计算机图形作业

第1章概述。1 一个计算机系统监视进入停车场的每一辆汽车,将其车牌号及车身颜色与数据库中记录对比以确定是否准入。请说明该系统在哪些方面使用计算机图形学 图像处理和模式识别技术。2 举例说明计算机图形学 图像处理和模式识别三个学科分支之间的主要区别及相互渗透。3.你认为学好计算机图形学需要哪些基础知识...

计算机图形作业

计算机图形作业。txt用快乐去奔跑,用心去倾听,用思维去发展,用努力去奋斗,用目标去衡量,用爱去生活。钱多钱少,常有就好!人老人少,健康就好!家贫家富,和睦就好。第1章概述。1 一个计算机系统监视进入停车场的每一辆汽车,将其车牌号及车身颜色与数据库中记录对比以确定是否准入。请说明该系统在哪些方面使用...

计算机上机作业

三 上机操作题第一部份2页 1 现有一个名为888的拨号连接,要求配置如下属性 号码从163改为8888,如果忙音重拨100次,每次间隔30秒,断线不重拨,使用windowsxp的防火墙。开始 设置 网络 选常规选项卡 号码 8888 选项选项卡 重拨次数 100 重拨间隔 30秒 去掉勾选 断线重...