计算机图形学实验全.docx

上传人:b****6 文档编号:5829217 上传时间:2023-01-01 格式:DOCX 页数:26 大小:162.57KB
下载 相关 举报
计算机图形学实验全.docx_第1页
第1页 / 共26页
计算机图形学实验全.docx_第2页
第2页 / 共26页
计算机图形学实验全.docx_第3页
第3页 / 共26页
计算机图形学实验全.docx_第4页
第4页 / 共26页
计算机图形学实验全.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

计算机图形学实验全.docx

《计算机图形学实验全.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验全.docx(26页珍藏版)》请在冰豆网上搜索。

计算机图形学实验全.docx

计算机图形学实验全

实验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);

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1