计算机图形学实验(全)

时间:2024.4.20

实验1 直线的绘制

实验目的

1、通过实验,进一步理解和掌握DDA和Bresenham算法;

2、掌握以上算法生成直线段的基本过程;

3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。

实验环境

计算机、Turbo C或其他C语言程序设计环境

实验学时

    2学时,必做实验。

实验内容

用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。

实验步骤

1、算法、原理清晰,有详细的设计步骤;

2、依据算法、步骤或程序流程图,用C语言编写源程序;

3、编辑源程序并进行调试;

4、进行运行测试,并结合情况进行调整;

5、对运行结果进行保存与分析;

6、把源程序以文件的形式提交;

7、按格式书写实验报告。

实验代码:DDA:

# include <graphics.h>

# include <math.h>

void DDALine(int x0,int y0,int x1,int y1,int color)

{

    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(){

        int  gdriver ,gmode ;

      gdriver = DETECT;

       initgraph(&gdriver , &gmode ,"C:\\TC20\\BGI");

       DDALine(0,0,35,26,4);

       getch ( );

       closegraph ( );

}

Bresenham:

#include<graphics.h>

#include<math.h>

void BresenhamLine(int x0,int y0,int x1,int y1,int color)

{

   int x,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(){

   int  gdriver ,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>

void CirclePoint(int x,int y,int color)

{

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

       }

void MidBresenhamCircle(int r,int color)

{

       int x,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"

void MidBresenhamEllipse(int a,int b,int color)

{

       int x,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( )

 {

        int  gdriver ,gmode ;

        gdriver = DETECT;

        initgraph(&gdriver , &gmode ,"c:\\tc20\\bgi" );

        MidBresenhamEllipse(8,6,2); 

        getch ( );

        closegraph ( );

}

实验截图:

实验3  图形填充

实验目的

4、通过实验,进一步理解和掌握图形填充常用算法;

5、掌握以上算法进行填充图形的基本过程;

6、通过编程,会在TC环境下完成图形填充。

实验环境

计算机、Turbo C或其他C语言程序设计环境

实验学时

    2学时,必做实验。

实验内容

任意画一个多边形,并用边填充算法进行填充。(多边形的顶点坐标存放在数组中,坐标值由键盘输入)

实验步骤

1、算法、原理清晰,有详细的设计步骤;

2、依据算法、步骤或程序流程图,用C语言编写源程序;

3、编辑源程序并进行调试;

4、进行运行测试,并结合情况进行调整;

5、对运行结果进行保存与分析;

6、打印源程序或把源程序以文件的形式提交;

7、按格式书写实验报告。

实验代码:

#include<graphics.h>

#include<stdio.h>

#include<math.h>

#include<conio.h>

#define MP 100

#include<stdlib.h>

#define false 0

void edge_mark(int arr[][2],int value,int polydeflen)

{

       int by,x,y,ax,ay;

       int i,j;

       float k;

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

              else for(j=y+1;j<ay;j++)

                     putpixel(x-(int)((j-y)*k),j,value);

              by=y;

       }

}

void edge_mark_fill(int ar[][2],int value,int polydeflen)

{

       int i,x,y,inside;

       int min,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);

                     else putpixel(x,y,0);

              }

              if(getch()==17)

                     exit(1);

       }

}

void main()

{   

       char t[100];

       int polydef[MP][2];

       int i,j,gdriver,gmode,polydeflen,value;

       gdriver=DETECT; 

       initgraph(&gdriver,&gmode,"c:\\tc20\\bgi" );

       printf("please input the number of edges:\n");

       scanf("%d",&polydeflen);

       printf("please input the color:\n");

       scanf("%d",&value);    

       printf("please input the (x,y):\n");

       for (i=0;i<polydeflen;i++)    

              for (j=0;j<2;j++)

                     scanf("%d",&polydef[i][j]); 

       printf("please press the 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环境下完成二维图形几何变换过程。

实验环境

计算机、Turbo C或其他C语言程序设计环境

实验学时

    2学时,必做实验。

实验内容

任意画一个平面图形,

(1)按比例缩小或放大.缩放比例由用户定义,缩放的参考点由用户确定;

(2)旋转.由键盘输入旋转角度和旋转中心。

实验步骤

1、算法、原理清晰,有详细的设计步骤;

2、依据算法、步骤或程序流程图,用C语言编写源程序;

3、编辑源程序并进行调试;

4、进行运行测试,并结合情况进行调整;

5、对运行结果进行保存与分析;

6、打印源程序或把源程序以文件的形式提交;

7、按格式书写实验报告。

实验代码:

#include "stdio.h"

#include "conio.h"

#include"graphics.h"

#include "math.h"

struct point

{

  int x;

  int y;

}triangle[3];

void ini()

{   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);

}

void zoom(float sx,float sy)

{

    int xx[3];

    int yy[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]);

    }

}

void turn(int x,int y,int a)

{

    int i;

    int xx[3];

    int yy[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]);

    }

}

void main()

{

    int gdriver=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环境下完成二维图形裁剪过程。

实验环境

计算机、Turbo C或其他C语言程序设计环境

实验学时

    2学时,必做实验。

实验内容

生成若干条直线段,由用户确定一个矩形裁剪窗口的位置和大小,保留窗口里的图形,抹去其余部分(使用Cohen-Sutherland算法)。

(完成作业的同学可以用line、setviewport函数再做该题)。

实验步骤

1、算法、原理清晰,有详细的设计步骤;

2、依据算法、步骤或程序流程图,用C语言编写源程序;

3、编辑源程序并进行调试;

4、进行运行测试,并结合情况进行调整;

5、对运行结果进行保存与分析;

6、打印源程序或把源程序以文件的形式提交;

7、按格式书写实验报告。

实验代码:

#include"graphics.h"

#include"stdio.h"

#include"math.h"

#define LEFT 1

#define RIGHT 2

#define BOTTOM 4

#define TOP 8

int x1=60,y1=60,x2=200,y2=200,x3=200,y3=300,xl=30,xr=100,yb=100,yt=20;

int encode(int x,int y,int*code)

{

       int c;

       c=0;

       if(x<xl)

           c=LEFT;

       else if(x>xr)

           c=RIGHT;

       if(y>yb)

 c=BOTTOM;

       else if(y<yt)

           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)

{

  int x,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);

       }

     else if((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);

       }

     else if((RIGHT&code)!=0)

       {

          x=xr;

           y=y1+(long)(y3-y1)*(xr-x1/x3-x1);

       }

     else if((BOTTOM&code)!=0)

        {

          y=yb;

           x=x1+(long)(x3-x1)*(yb-y1)/(y3-y1);

        }

     else if((TOP&code)!=0)

       {

         y=yt;

          x=x1+(long)(x3-x1)*(yt-y1)/(y3-y1);

       }

     if(code==code1)

       {x1=x;

         y1=y;

         encode(x,y,&code1);

       }

     else

       {x3=x;

         y3=y;

         encode(x,y,&code3);

       }

     }

while(code3!=0||code2!=0)

  {

     if(code3&code2!=0)

       return;

      code=code3;

      if(code3==0)

         code=code2;

      if((LEFT&code)!=0)

       {

          x=x3;

          y=y3+(long)(y2-y3)*(xl-x3)/(x2-x3);

       }

     else if((RIGHT&code)!=0)

       {

          x=xr;

           y=y1+(long)(y2-y3)*(xr-x3/x2-x3);

       }

     else if((BOTTOM&code)!=0)

        {

          y=yb;

           x=x1+(long)(x2-x1)*(yb-y3)/(y2-y3);

        }

     else if((TOP&code)!=0)

       {

         y=yt;

          x=x1+(long)(x2-x1)*(yt-y3)/(y2-y3);

       }

     if(code==code3)

       {x1=x;

         y1=y;

         encode(x,y,&code3);

       }

     else

       {x2=x;

         y2=y;

         encode(x,y,&code2);

       }

     }

     setcolor(RED);

     line(x1,y1,x2,y2);

     line(x1,y1,x3,y3);

     line(x2,y2,x3,y3);

     return;

}

void main()

{

  int graphdriver=DETECT,graphmode;

  initgraph(&graphdriver,&graphmode,"C:\\TC20\\BGI");

  rectangle(xl,yt,xr,yb);

  line(x1,y1,x2,y2);

  line(x1,y1,x3,y3);

  line(x2,y2,x3,y3);

  C_S_LINECLIP(x1,y1,x2,y2,x3,y3,xl,xr,yb,yt);

  getch();

  closegraph();

}

实验截图:

实验6  曲线生成算法的实现

实验目的

了解曲线生成的原理,掌握几种常见的曲线生成算法,利用TurboC实现Bezier曲线的生成算法。

实验环境

计算机、Turbo C或其他C语言程序设计环境

实验学时

    2学时,必做实验。

实验内容

(1) 了解曲线生成的原理;

(2) 掌握曲线生成算法(Bezier曲线、B样条曲线);

(3) 利用TurboC实现Bezier曲线的生成算法,在屏幕上任意绘制一条三次Bezier曲线。

实验步骤

1、算法、原理清晰,有详细的设计步骤;

2、依据算法、步骤或程序流程图,用C语言编写源程序;

3、编辑源程序并进行调试;

4、进行运行测试,并结合情况进行调整;

5、对运行结果进行保存与分析;

6、打印源程序或把源程序以文件的形式提交;

7、按格式书写实验报告。

实验代码:

#include "graphics.h"

#include "malloc.h"

#include "math.h"

#define MULTIPLE 7

#define ROW 4

struct node{

  float x,y;

};

void draw_polygon(struct node a[],int originx,int originy)

{

    int n;

    for (n=0;n<ROW;n++){

       if (n==0) moveto(originx+a[0].x,originy-a[0].y);

       lineto(originx+a[n].x,originy-a[n].y);

    }

}

struct node decasteljau(struct node p[],int n,float u)

{

   int i,r;

   struct node point,q[20];

   for(i=0;i<n;i++)

       q[i]=p[i];

   for(r=1;r<n;r++)

      for(i=0;i<n-r;i++){

         q[i].x=(1.0-u)*q[i].x+u*q[i+1].x;

         q[i].y=(1.0-u)*q[i].y+u*q[i+1].y;

      }

   return q[0];

}

void draw_bezier_curve(struct node p[],int n,int x0,int y0)

{

  int i,x,y;

  float u,delta;

  struct node point;

  delta=1.0/(float)(MULTIPLE*ROW);

  for(i=0,u=0;u<=1.0;i++,u=u+delta){

      point=decasteljau(p,n,u);

      if(i==0)moveto(x0+point.x,y0-point.y);

      lineto(x0+point.x,y0-point.y);

  }

}

main()

{

   int gdriver=DETECT,gmode;

   int number,n,originx,originy;

   struct node a[]={{120,0},{45,0},{0,45},{0,120}};

   initgraph(&gdriver,&gmode,"");

   originx=getmaxx()/2;

   originy=getmaxy()/2;

   setcolor(BLUE);

   draw_polygon(a,originx,originy);

   setcolor(RED);

   draw_bezier_curve(a,ROW,originx,originy);

   getch();

   closegraph();

}

实验截图:

更多相关推荐:
计算机图形学实验报告

福建农林大学计算机与信息学院课程名称姓名系专业年级学号指导教师职称实验报告计算机图形学洪世玉计算机计算机科学与技术10级102260010072李小林20xx年11月19日实验项目列表福建农林大学计算机与信息学...

计算机图形学实验报告及代码

第1章概述一教学目标通过本章的学习使学生能够了解计算机图形学的基本概念研究内容当前的发展概况本门课程的特点和应用二教学要求1了解计算机图形学的概念和研究内容2了解本门课程的发展概况三教学内容提要1计算机图形学的...

计算机图形学实验报告

计算机图形学实验报告河南理工大学测绘学院计算机图形学实验报告学号姓名成绩评语交报告日期20xx年6月25日计算机图形学实验报告实验项目一图形学光栅化算法验证实验实验日期20xx年6月5日一实验目的1加强对直线圆...

计算机图形学实验报告

实验报告实验课程计算机图形学学生姓名XXXX学号专业班级软件20xx年12月25日目录i实验一矩阵变换ii实验二图形绘制iii实验三曲线的生成算法实现iv实验四二维基本图形生成的算法v实验五二维填充图的生成算法...

计算机图形学实验报告

班级10计科姓名敖智挺学号20xx30457117实验一直线生成与二次曲线拟合实验内容应用Bresenham画线算法实现一程序完成直线生成实验目的了解掌握VC下D图元的扫描转换原理及VC实现掌握图元属性原理及V...

计算机图形学实验报告

计算机图形学实验报告学号20xx2115姓名班级计算机2班指导老师何太军20xx619实验一Windows图形程序设计基础1实验目的1学习理解Win32应用程序设计的基本知识SDK编程2掌握Win32应用程序的...

计算机图形学实验报告2

计算机图形学实验报告实验名称区域填充算法和裁剪算法实验四区域填充算法一实验目的及要求1掌握区域填充的基本算法原理2会使用字符的图形输出3实践与巩固区域填充的基本生成算法4掌握这些算法的原理及实现二理论基础1了解...

计算机图形学 实验报告(4)

怀化学院数学实验中心实验报告学号实验地点姓名指导教师年级班实验时间实验四图形的裁剪一实验目的1掌握二维图形的基本裁剪算法如编码算法中点分割算法LiangBarsky算法2掌握OpenGL中矩阵堆栈函数的使用实现...

计算机图形学实验报告

计算机图形学实验报告姓名学号班级实验地点实验时间谢云飞20xx2497计算机科学与技术112班逸夫楼50720xx03实验1直线的生成1实验目的和要求理解直线生成的原理掌握典型直线生成算法掌握步处理分析实验数据...

计算机图形学实验报告

计算机图形学实验报告计算机072070814082周蔓计算机图形学实验报告一实验题目利用计算机编程语言绘制图形主要实现以下内容1中点算法生成任意斜率直线并设置线型线宽2中点算法生成圆3中点算法生成椭圆4扫描算法...

计算机图形学实验报告

计算机图形学实验报告班级软工0801班学号U20xx18013姓名严森指导教师万琳完成日期20xx113华中科技大学软件学院实验一基本图元绘制一实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架并...

计算机图形学实验报告实验6

贵州大学实验报告学院计算机科学与信息学院专业计科班级101注可根据教学需要对以上栏目进行增减表格内容可根据内容扩充

计算机图形学实验报告(45篇)