计算机图形学实验全Word格式文档下载.docx
《计算机图形学实验全Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验全Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
#include<
graphics.h>
math.h>
voidDDALine(intx0,inty0,intx1,inty1,intcolor)
{
intdx,dy,epsl,k;
floatx,y,xIncre,yIncre;
dx=x1-x0;
dy=y1-y0;
x=x0;
y=y0;
if(abs(dx)>
abs(dy))
epsl=abs(dx);
else
epsl=abs(dy);
xIncre=(float)dx/(float)epsl;
yIncre=(float)dy/(float)epsl;
for(k=0;
k<
=epsl;
k++)
{
putpixel((int)(x+0.5),(int)(y+0.5),4);
x+=xIncre;
y+=yIncre;
}
}
main(){
intgdriver,gmode;
gdriver=DETECT;
initgraph(&
gdriver,&
gmode,"
C:
\\TC20\\BGI"
);
DDALine(0,0,35,26,4);
getch();
closegraph();
Bresenham:
#include<
voidBresenhamLine(intx0,inty0,intx1,inty1,intcolor)
intx,y,dx,dy,e;
e=-dx;
x=x0;
y=y0;
while(x<
=x1){
putpixel(x,y,color);
x++;
e=e+2*dy;
if(e>
0){
y++;
e=e-2*dx;
main(){
initgraph(&
c:
BresenhamLine(0,0,120,200,5);
getch();
closegraph();
实验2圆和椭圆的绘制
1、通过实验,进一步理解和掌握中点算法;
2、掌握以上算法生成椭圆或圆的基本过程;
3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。
用中点(Besenham)算法实现椭圆或圆的绘制。
1.算法、原理清晰,有详细的设计步骤;
2.依据算法、步骤或程序流程图,用C语言编写源程序;
3.编辑源程序并进行调试;
4.进行运行测试,并结合情况进行调整;
5.对运行结果进行保存与分析;
6.打印源程序或把源程序以文件的形式提交;
7.按格式书写实验报告。
分析与思考
1.为何在程序运行时,有的椭圆或圆仅在屏幕左上角显示了一部分?
2.用中点算法生成的椭圆,为何在半径较大时,图形的失真严重?
圆:
voidCirclePoint(intx,inty,intcolor)
putpixel(x+100,y+100,color);
putpixel(-x+100,y+100,color);
putpixel(x+100,-y+100,color);
putpixel(-x+100,-y+100,color);
putpixel(y+100,x+100,color);
putpixel(y+100,-x+100,color);
putpixel(-y+100,x+100,color);
putpixel(-y+100,-x+100,color);
voidMidBresenhamCircle(intr,intcolor)
intx,y,d;
x=0;
y=r;
d=1-r;
=y){
CirclePoint(x,y,color);
if(d<
0)d+=2*x+3;
else{
d+=2*(x-y)+5;
y--;
}
x++;
main()
\\tc20\\bgi"
);
MidBresenhamCircle(50,6);
实验截图:
椭圆:
#include"
graphics.h"
voidMidBresenhamEllipse(inta,intb,intcolor)
intx,y;
floatd1,d2;
y=b;
d1=b*b+a*a*(-b+0.5);
putpixel(x+100,-y+100,color);
while(b*b*(x+1)<
a*a*(y-0.5)){
if(d1<
=0){
d1+=b*b*(2*x+3);
}
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
y--;
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while(y>
0){
if(d2<
=0){
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;
y--;
d2+=a*a*(-2*y+3);
}
}
MidBresenhamEllipse(8,6,2);
实验3图形填充
4、通过实验,进一步理解和掌握图形填充常用算法;
5、掌握以上算法进行填充图形的基本过程;
6、通过编程,会在TC环境下完成图形填充。
任意画一个多边形,并用边填充算法进行填充。
(多边形的顶点坐标存放在数组中,坐标值由键盘输入)
6、打印源程序或把源程序以文件的形式提交;
stdio.h>
conio.h>
#defineMP100
stdlib.h>
#definefalse0
voidedge_mark(intarr[][2],intvalue,intpolydeflen)
intby,x,y,ax,ay;
inti,j;
floatk;
by=arr[polydeflen-1][1];
for(i=0;
i<
polydeflen;
i++)
if(i==polydeflen-1)
{
ax=arr[0][0];
ay=arr[0][1];
else
ax=arr[i+1][0];
ay=arr[i+1][1];
x=arr[i][0];
y=arr[i][1];
if((y-ay)!
=0)
k=(ax-x)/(float)(y-ay);
if((y-by)*(ay-y)>
putpixel(x,y,value);
getch();
if(ay<
y)
for(j=y-1;
j>
ay;
j--)
putpixel(x+(int)((y-j)*k),j,value);
elsefor(j=y+1;
j<
j++)
putpixel(x-(int)((j-y)*k),j,value);
by=y;
voidedge_mark_fill(intar[][2],intvalue,intpolydeflen)
inti,x,y,inside;
intmin,max;
inside=false;
min=ar[0][1];
max=ar[0][1];
edge_mark(ar,value,polydeflen);
for(i=1;
if(ar[i][1]>
max)
max=ar[i][1];
if(ar[i][1]<
min)
min=ar[i][1];
for(y=min;
y<
=max;
y++)
for(x=0;
x<
=640;
x++)
if(getpixel(x,y)==value)