计算机图形学实验全.docx
- 文档编号:5829217
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:26
- 大小:162.57KB
计算机图形学实验全.docx
《计算机图形学实验全.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验全.docx(26页珍藏版)》请在冰豆网上搜索。
计算机图形学实验全
实验1直线得绘制
实验目得
1、通过实验,进一步理解与掌握DDA与Bresenham算法;
2、掌握以上算法生成直线段得基本过程;
3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段得绘制.
实验环境
计算机、TurboC或其她C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
用DDA算法或Besenham算法实现斜率k在0与1之间得直线段得绘制.
实验步骤
1、算法、原理清晰,有详细得设计步骤;
2、依据算法、步骤或程序流程图,用C语言编写源程序;
3、编辑源程序并进行调试;
4、进行运行测试,并结合情况进行调整;
5、对运行结果进行保存与分析;
6、把源程序以文件得形式提交;
7、按格式书写实验报告.
实验代码:
DDA:
#include〈graphics、h〉
# include <math、h>
voidDDALine(intx0,inty0,int x1,inty1,intcolor)
{
int dx,dy,epsl,k;
float x,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〈graphics、h〉
#include〈math、h>
voidBresenhamLine(intx0,int y0,intx1,int y1,intcolor)
{
intx,y,dx,dy,e;
dx=x1-x0;
dy=y1—y0;
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(){
intgdriver,gmode ;
gdriver=DETECT;
initgraph(&gdriver,&gmode ,”c:
\\TC20\\BGI");
BresenhamLine(0,0, 120, 200,5);
getch();
closegraph();
}
实验2 圆与椭圆得绘制
实验目得
1、通过实验,进一步理解与掌握中点算法;
2、掌握以上算法生成椭圆或圆得基本过程;
3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆得绘制。
实验环境
计算机、Turbo C或其她C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
用中点(Besenham)算法实现椭圆或圆得绘制.
实验步骤
1.算法、原理清晰,有详细得设计步骤;
2.依据算法、步骤或程序流程图,用C语言编写源程序;
3.编辑源程序并进行调试;
4.进行运行测试,并结合情况进行调整;
5.对运行结果进行保存与分析;
6.打印源程序或把源程序以文件得形式提交;
7.按格式书写实验报告。
分析与思考
1.为何在程序运行时,有得椭圆或圆仅在屏幕左上角显示了一部分?
2.用中点算法生成得椭圆,为何在半径较大时,图形得失真严重?
实验代码:
圆:
#include<graphics、h〉
#include〈math、h〉
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,int color)
{
ﻩintx,y,d;
x=0;y=r;d=1-r;
ﻩwhile(x<=y){
ﻩCirclePoint(x,y,color);
ﻩﻩif(d<0)d+=2*x+3;
ﻩelse{
ﻩﻩd+=2*(x-y)+5;
ﻩy--;
ﻩ}
x++;
}
}
main( )
{
int gdriver,gmode;
ﻩgdriver=DETECT;
initgraph(&gdriver ,&gmode,"c:
\\tc20\\bgi”);
MidBresenhamCircle(50,6);
getch();
ﻩclosegraph( );
}
实验截图:
椭圆:
#include "graphics、h"
voidMidBresenhamEllipse(inta,int b,int color)
{
intx,y;
ﻩfloat d1,d2;
x=0;y=b;
d1=b*b+a*a*(-b+0、5);
putpixel(x+100,y+100,color); putpixel(—x+100,-y+100,color);
putpixel(-x+100,y+100,color);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);
x++;
}
else{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++;y--;
}
putpixel(x+100,y+100,color);putpixel(-x+100,—y+100,color);
putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);
ﻩ}
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--;
}
ﻩelse{
ﻩﻩd2+=a*a*(-2*y+3);
ﻩﻩy——;
ﻩ}
putpixel(x+100,y+100,color);putpixel(-x+100,—y+100,color);
putpixel(—x+100,y+100,color);putpixel(x+100,—y+100,color); ﻩ
ﻩ}
}
main()
{
ﻩintgdriver,gmode;
gdriver= DETECT;
initgraph(&gdriver , &gmode,”c:
\\tc20\\bgi");
MidBresenhamEllipse(8,6,2);
getch();
closegraph ( );
}
实验截图:
实验3 图形填充
实验目得
4、通过实验,进一步理解与掌握图形填充常用算法;
5、掌握以上算法进行填充图形得基本过程;
6、通过编程,会在TC环境下完成图形填充。
实验环境
计算机、TurboC或其她C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
任意画一个多边形,并用边填充算法进行填充.(多边形得顶点坐标存放在数组中,坐标值由键盘输入)
实验步骤
1、算法、原理清晰,有详细得设计步骤;
2、依据算法、步骤或程序流程图,用C语言编写源程序;
3、编辑源程序并进行调试;
4、进行运行测试,并结合情况进行调整;
5、对运行结果进行保存与分析;
6、打印源程序或把源程序以文件得形式提交;
7、按格式书写实验报告。
实验代码:
#include〈graphics、h>
#include
#include〈math、h>
#include〈conio、h>
#defineMP100
#include〈stdlib、h>
#definefalse 0
voidedge_mark(intarr[][2],intvalue,intpolydeflen)
{
ﻩint by,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)>=0)
ﻩﻩ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 ﻩﻩputpixel(x-(int)((j-y)*k),j,value); by=y; ﻩ} } voidedge_mark_fill(intar[][2],int value,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;i〈polydeflen;i++) ﻩ{ ﻩ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) ﻩﻩinside=! (inside); ﻩif(inside! =false) ﻩﻩputpixel(x,y,value); ﻩelseputpixel(x,y,0); ﻩ} ﻩif(getch()==17) exit (1); ﻩ} } voidmain() { ﻩchart[100]; int polydef[MP][2]; inti,j,gdriver,gmode,polydeflen,value; ﻩgdriver=DETECT;ﻩ initgraph(&gdriver,&gmode,"c: \\tc20\\bgi"); ﻩprintf("pleaseinputthenumberofedges: \n"); scanf("%d",&polydeflen); ﻩprintf("pleaseinputthecolor: \n”); scanf("%d”,&value); ﻩprintf("pleaseinput the(x,y): \n"); for(i=0;i<polydeflen;i++)ﻩ ﻩﻩfor(j=0;j<2;j++) ﻩﻩscanf("%d”,&polydef[i][j]); printf("pleasepressthe space key! ”); edge_mark_fill(polydef,value,polydeflen); for(i=0;i<polydeflen;i++)ﻩ ﻩ{ ﻩﻩsprintf(t,"(%d,%d)",polydef[i][0],polydef[i][1]); outtextxy(polydef[i][0],polydef[i][1],t); ﻩ} ﻩgetch(); closegraph(); } 实验截图: 实验4二维图形几何变换 实验目得 1、通过实验,进一步理解与掌握二维图形几何变换算法; 2、掌握以上算法进行二维图形几何变换基本过程; 3、通过编程,会在TC环境下完成二维图形几何变换过程。 实验环境 计算机、TurboC或其她C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 任意画一个平面图形, (1)按比例缩小或放大、缩放比例由用户定义,缩放得参考点由用户确定; (2)旋转、由键盘输入旋转角度与旋转中心。 实验步骤 1、算法、原理清晰,有详细得设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、打印源程序或把源程序以文件得形式提交; 7、按格式书写实验报告。 实验代码: #include”stdio、h” #include"conio、h" #include”graphics、h” #include "math、h” structpoint { intx; inty; }triangle[3]; voidini() {triangle[0]、x=30; triangle[0]、y=30; triangle[1]、x=30; triangle[1]、y=120; triangle[2]、x=120; triangle[2]、y=70; setcolor(RED); line(triangle[0]、x,triangle[0]、y,triangle[1]、x,triangle[1]、y); line(triangle[0]、x,triangle[0]、y,triangle[2]、x,triangle[2]、y); line(triangle[1]、x,triangle[1]、y,triangle[2]、x,triangle[2]、y); } voidzoom(floatsx,floatsy) { int xx[3]; intyy[3]; int i; for(i=0;i<3;i++) { xx[i]=(triangle[i]、x-triangle[0]、x)*sx+triangle[0]、x; yy[i]=(triangle[i]、y—triangle[0]、y)*sy+triangle[0]、y; } for(i=0;i<3;i++) { line(xx[i]+120,yy[i],xx[(i+1)%3]+120,yy[(i+1)%3]); } getch(); setcolor(5); for(i=0;i〈3;i++) { line(xx[i]+120,yy[i],xx[(i+1)%3]+120,yy[(i+1)%3]); } } voidturn(intx,int y,inta) { inti; intxx[3]; intyy[3]; for(i=0;i〈3;i++){ xx[i]=(triangle[i]、x-x)*cos(a)-(triangle[i]、y—y)*sin(a)+x; yy[i]=(triangle[i]、x-x)*sin(a)+(triangle[i]、y—y)*cos(a)+y; } for(i=0;i<3;i++) { line(xx[i],yy[i],xx[(i+1)%3],yy[(i+1)%3]); } getch(); setcolor(5); for(i=0;i〈3;i++) { line(xx[i],yy[i],xx[(i+1)%3],yy[(i+1)%3]); } } voidmain() { intgdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"c: \\tc20\\bgi"); ini(); getch(); ﻩsetcolor(0); turn(120,70,-1); ini(); ﻩgetch(); setcolor(0); zoom(0、5,0、5); ini(); ﻩgetch(); setcolor(0); zoom(3,3); ﻩini(); getch(); closegraph(); } 实验截图: 实验5二维图形裁剪 实验目得 1、通过实验,进一步理解与掌握二维图形裁剪常用算法; 2、掌握以上算法进行二维图形裁剪得基本过程; 3、通过编程,会在TC环境下完成二维图形裁剪过程。 实验环境 计算机、TurboC或其她C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 生成若干条直线段,由用户确定一个矩形裁剪窗口得位置与大小,保留窗口里得图形,抹去其余部分(使用Cohen-Sutherland算法)。 (完成作业得同学可以用line、setviewport函数再做该题)。 实验步骤 1、算法、原理清晰,有详细得设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、打印源程序或把源程序以文件得形式提交; 7、按格式书写实验报告. 实验代码: #include”graphics、h” #include"stdio、h” #include"math、h" #defineLEFT1 #define RIGHT2 #defineBOTTOM4 #defineTOP8 int x1=60,y1=60,x2=200,y2=200,x3=200,y3=300,xl=30,xr=100,yb=100,yt=20; int encode(intx,inty,int*code) { int c; c=0; ﻩif(x c=LEFT; elseif(x〉xr) c=RIGHT; ﻩif(y>yb) c=BOTTOM; ﻩelseif(y c=TOP; if(x==xl||x==xr||y==yt||y==yb) c=0; *code=c; } C_S_LINECLIP(x1,y1,x2,y2,x3,y3,xl,xr,yb,yt) { intx,y,code1,code2,code3,code; encode(x1,y1,&code1); encode(x2,y2,&code2); encode(x3,y3,&code3); while(code1! =0||code2! =0) { if(code1&code2! =0) return; code=code1; if(code1==0) code=code2; if((LEFT&code)! =0) { ﻩx=x1; ﻩy=y1+(long)(y2-y1)*(xl-x1)/(x2-x1); } else if((RIGHT&code)! =0) { x=xr; ﻩ y=y1+(long)(y2—y1)*(xr-x1/x2—x1); } elseif((BOTTOM&code)! =0) { y=yb; x=x1+(long)(x2—x1)*(yb—y1)/(y2—y1); } else if((TOP&code)! =0) { y=yt; x=x1+(long)(x2-x1)*(yt—y1)/(y2—y1); } if(code==code1) {x1=x; y1=y; encode(x,y,&code1); } else {x2=x; y2=y; encode(x,y,&code2); } } while(code1! =0||code3! =0) { if(code1&code3! =0) return; code=code1; if(code1==0) code=code3; if((LEFT&code)! =0) { x=x1; y=y1+(long)(y3-y1)*(xl-x1)/(x3-x1); } elseif((RIGHT&code)! =0) { x=xr; y=y1+(long)(y3—y1)*(xr-x1/x3—x1); } elseif((BOTTOM&code)! =0) { y=yb; x=x1+(long)(x3—x1)*(yb-y1)/(y3-y1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验