计算机图形上机作业文档格式.docx
- 文档编号:15393430
- 上传时间:2022-10-30
- 格式:DOCX
- 页数:30
- 大小:215.25KB
计算机图形上机作业文档格式.docx
《计算机图形上机作业文档格式.docx》由会员分享,可在线阅读,更多相关《计算机图形上机作业文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
,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,不利于计算。
为此,我们构造一个新的判别式:
(3)
其中,,当时,和同号。
以i+1代入式
(2)中的i,得:
(4)
(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;
ifPi>
0则yi+1=yi+1;
否则yi+1=yi;
3.画点(xi+1,yi+1);
4.求下一个误差Pi+1;
0则Pi+1=Pi+2dy-2dx;
否则Pi+1=Pi+2dy;
5.然后根据Pi+1的符号,再求yi+2的坐标,依次类推,直到到达终点(x2,y2)。
实验步骤:
1.打开TurboC编程环境。
2.编程实现DDA算法和Bresenham算法画直线。
3.算法示例:
(1)DDA算法画直线:
#include"
stdio.h"
conio.h"
graphics.h"
#defineround(x)((int)((x>
=0)?
(x+0.5):
(x-0.5)));
voidsetpixel(intx,inty)
{
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(intx1,inty1,intx2,inty2)
floatx=1+3*x1,y=1+3*y1;
intz;
floatk;
if(x1==x2)
{
if(y2>
=y1)
for(;
y<
=1+3*y2;
y=y+3)
setpixel(x,y);
}
else
y>
=1+y2*3;
y=y-3)
setpixel(x,y);
else
k=(float)(y2-y1)/(x2-x1);
if(k<
=1&
&
k>
=-1&
x2>
=x1)
{
z=1+y1*3;
x<
=1+x2*3;
x=x+3)
{
setpixel(x,z);
y=y+3*k;
z=round(y);
}
}
x2<
x1)
x>
x=x-3)
y=y-3*k;
if(k>
1&
y2>
z=1+x1*3;
setpixel(z,y);
x=x+3/k;
z=round(x);
y2<
y1)
1+y2*3;
x=x-3/k;
-1&
voidmain()
intDriver=VGA;
intDmode=VGAHI;
intx1,y1,x2,y2;
intgdriver=DETECT,gmode;
registerbgidriver(EGAVGA_driver);
initgraph(&
Driver,&
Dmode,"
G:
\\TC\\Project"
);
printf("
inputthestartpoint:
\n"
x1="
scanf("
%d"
&
x1);
y1="
y1);
inputtheendpoint:
x2="
x2);
y2="
y2);
DDAline(x1,y1,x2,y2);
getch();
(2)Bresenham算法画直线:
#include<
stdio.h>
conio.h>
#include<
graphics.h>
time.h>
voidswap(int*m,int*n)
intt;
t=*m;
*m=*n;
*n=t;
voidbresenhamline(intx0,inty0,intx1,inty1,intcolor)
intx,y,dx,dy,p,same,change;
if(x0==x1)
if(y0>
y1)
swap(&
y0,&
x=x0,y=y0;
for(;
y1;
y++)
putpixel(x,y,color);
return;
if(x0>
x1)
x0,&
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;
x1;
x++)
if(p<
0)
p+=same;
else
p+=change;
y++;
elseif(-dx<
p=-dx-dy<
1,same=-dy<
1,change=(-dy-dx)<
y--;
elseif(dx<
dy)
p=dx<
1-dy,same=dx<
1,change=(dx-dy)<
x++;
p=-dx*2-dy,same=-dx*2,change=-(dx+dy)*2,x=x0,y=y0;
x--;
main()
intx0,y0,x1,y1;
x0="
x0);
y0="
y0);
sc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形 上机 作业