计算机图形学实验报告-几何变换

时间:2024.4.14

                                                              班    级      R数学111           

大连交通大学                               姓    名                           

实 验 报 告                     同 组 人                           

课程名称:      计算机图形学                                  成    绩                          

实验名称:      几何变换                                      指导老师                           

              


第二篇:计算机图形学 图形几何变换的实现


实验五 图形几何变换的实现

班级 08信计2  学号 62 姓名赵国辉  分数    

、实验目的和要求:

1、掌握理解二维、三维变换的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用Turboc实现二维、三维图形的基本变换和复合变换。

二、实验内容:

1、理解采用齐次坐标进行图形变换的必要性——变换的连续性,使复合变换得以实现。

2、掌握二维、三维图形基本变换(平移、缩放、对称、旋转、错切)的原理及数学公式。

3、利用Turboc实现二维、三维图形的基本变换、复合变换,在屏幕上显示变换过程或变换结果。

三、实验结果分析:

程序代码如下:

/*二维图形(直线)平移变换*/

#include<stdio.h>

#include<graphics.h>

#include<conio.h>

main()

{int x0,y0,x1,y1,i,j;

int a[3][3];

char key;

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

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

              a[i][j]=0;

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

       a[i][i]=1;

int graphdriver=DETECT;

int graphmode=0;

initgraph(&graphdriver,&graphmode," ");

cleardevice();

x0=250;y0=120;x1=350;y1=220;

line(x0,y0,x1,y1);

for( ; ;)

{outtextxy(100,400,"<-:left->:right^:up v:down Esc->exit");

key=getch();

switch(key)

{

case 75: a[2][0]=-10;

       break;

case 77: a[2][0]=10;

       break;

case 72: a[2][1]=-10;

       break;

case 80: a[2][1]=10;

       break;

case 27: exit(0);

       break;

}

x0=x0*a[0][0]+y0*a[1][0]+a[2][0];

y0=x0*a[0][1]+y0*a[1][1]+a[2][1];

x1=x1*a[0][0]+y1*a[1][0]+a[2][0];

y1=x1*a[0][1]+y1*a[1][1]+a[2][1];

cleardevice();

line(x0,y0,x1,y1);

}

closegraph();

}

2. 三维图形(立方体)旋转和比例变换的算法:

#include<stdio.h>

#include<math.h>

#include<graphics.h>

#include<conio.h>

#include<time.h>

#include<ctype.h>

#define  ZOOM_IN 0.9

#define ZOOM_OUT 1.1

int turn1[3];    /* [0] rx,[1] ry,[3] zoom*/

typedef struct

{

float x;

float y;

float z;

}point;

typedef struct

{

float x;

float y;

}point2d;

typedef struct

{float x;

float y;

float h;

point biao[8];

}fanti;

void make_box(float x,float y,float h,fanti *p)

{

p->x=x;p->y=y;p->h=h;

p->biao[0].x=x/2;

p->biao[0].y=y/2;

p->biao[0].z=h/2;

p->biao[1].x=-x/2;

p->biao[1].y=y/2;

p->biao[1].z=h/2;

p->biao[2].x=-x/2;

p->biao[2].y=-y/2;

p->biao[2].z=h/2;

p->biao[3].x=x/2;

p->biao[3].y=-y/2;

p->biao[3].z=h/2;

p->biao[4].x=x/2;

p->biao[4].y=y/2;

p->biao[4].z=-h/2;

p->biao[5].x=-x/2;

p->biao[5].y=y/2;

p->biao[5].z=-h/2;

p->biao[6].x=-x/2;

p->biao[6].y=-y/2;

p->biao[6].z=-h/2;

p->biao[7].x=x/2;

p->biao[7].y=-y/2;

p->biao[7].z=-h/2;

}

void trun2d(point *p,point2d *q)

{

q->x=p->x+p->z*cos(0.25);

q->y=p->y+p->z*sin(0.25);

}

void initm(float mat[][4])

{

int count;

for(count=0;count<4;count++)

{ mat[count][0]=0.;

 mat[count][1]=0.;

  mat[count][2]=0.;

   mat[count][3]=0.;

    mat[count][count]=1.;

}

return;

}

void transfrom(point *p,point *q,float tm[][4])

{

float xu,yv,zw,h;

xu=tm[0][0]*p->x+tm[1][0]*p->y+tm[2][0]*p->z+tm[3][0];

yv=tm[0][1]*p->x+tm[1][1]*p->y+tm[2][1]*p->z+tm[3][1];

zw=tm[0][2]*p->x+tm[1][2]*p->y+tm[2][2]*p->z+tm[3][2];

p->x=xu;

p->y=yv;

p->z=zw;

return;

}

void rotationx(point *p,float alfa,float tm[][4])

{

float rad=0.0174532925;

initm(tm);

tm[1][1]=cos(rad*alfa);

tm[1][2]=sin(rad*alfa);

tm[2][1]=-tm[1][2];

tm[2][2]=tm[1][1];

return;

}

void rotationz(point *p,float alfa,float tm[][4])

{

float rad=0.0174532925;

initm(tm);

tm[0][0]=cos(rad*alfa);

tm[0][1]=sin(rad*alfa);

tm[1][0]=-tm[0][1];

tm[1][1]=tm[0][0];

return;

}

void rotationy(point *p,float alfa,float tm[][4])

{

float rad=0.0174532925;

initm(tm);

tm[0][0]=cos(rad*alfa);

tm[2][0]=sin(rad*alfa);

tm[0][2]=-tm[2][0];

tm[2][2]=tm[0][0];

return;

}

void adjust(point *p,point *q)

{

float t[4][4];

switch(turn1[0])

{

case 1:

rotationy(p,2,t);

transfrom(p,q,t);

break;

case -1:

rotationy(p,-2,t);

transfrom(p,q,t);

break;

default:break;

}

switch(turn1[1])

{

case 1:

rotationz(p,2,t);

transfrom(p,q,t);

break;

case -1:

rotationz(p,-2,t);

transfrom(p,q,t);

break;

default:break;

}

switch(turn1[2])

{

case 1:

q->x=ZOOM_IN*p->x;

q->y=ZOOM_IN*p->y;

q->z=ZOOM_IN*p->z;

break;

case -1:

q->x=ZOOM_OUT*p->x;

q->y=ZOOM_OUT*p->y;

q->z=ZOOM_OUT*p->z;

break;

default:break;

}

}

void drawbox(fanti *p)

{

point2d fan2d[8];

int i;

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

{

adjust(&p->biao[i],&p->biao[i]);

trun2d(&p->biao[i],&fan2d[i]);

fan2d[i].x+=300;

fan2d[i].y+=200;

}

cleardevice();

setcolor(RGB(255,24,39));

outtext(" ->:right   <-:left  ^:up   v:down");

moveto(0,20);

outtext("page up:zoom in   page down:zoom out   space:redraw  Esc:exit");

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

{

if(i==3)

{line(fan2d[i].x,fan2d[i].y,fan2d[0].x,fan2d[0].y);

 line(fan2d[i+4].x,fan2d[i+4].y,fan2d[4].x,fan2d[4].y);

}

else

{line(fan2d[i].x,fan2d[i].y,fan2d[i+1].x,fan2d[i+1].y);

 line(fan2d[i+4].x,fan2d[i+4].y,fan2d[i+5].x,fan2d[i+5].y);

}

line(fan2d[i].x,fan2d[i].y,fan2d[i+4].x,fan2d[i+4].y);

}

}

void main()

{

int gd=DETECT,gm,i,j;

char key;

float x,y,h;

fanti a1;

 x=100;

 y=100;

 h=100;

 initgraph(&gd,&gm,"");

 make_box(x,y,h,&a1);

 drawbox(&a1);

 for(;;)

 {

        turn1[0];

        turn1[1];

        turn1[2];

        key=getch();

        switch(key)

        {case 77: turn1[0]=1;

                   break;    /*RIGHT*/

       case 75: turn1[0]=-1;

                      break;    /*LIFT*/

        case 72:turn1[1]=1;

                break;    /*UP*/

              case 80:turn1[1]=-1;

                break;    /*DOWN*/

         case 73:turn1[2]=1;

                 break;   /*ZOOM IN*/

              case 81:turn1[2]=-1;

                 break;   /*ZOOM OUT*/

              case 32:make_box(x,y,h,&a1);

                 break;   /*REDRAW*/

              case 27:exit(0);

                     break;        /*ESC*/

              default: key=0;

                          break;

        }

        if(key!=0) drawbox(&a1);

 }

 closegraph();

}

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

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

计算机图形学实验(全)

实验1直线的绘制实验目的1通过实验进一步理解和掌握DDA和Bresenham算法2掌握以上算法生成直线段的基本过程3通过编程会在TC环境下完成用DDA或中点算法实现直线段的绘制实验环境计算机TurboC或其他C...

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

第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应用程序的...

计算机图形学实验二:直线的生成算法的实现

实验二直线的生成算法的实现班级08信计2班学号20xx05020xx姓名分数一实验目的和要求1理解直线生成的原理2掌握几种常用的直线生成算法3利用C实现直线生成的DDA算法二实验内容1了解直线的生成原理2掌握几...

计算机图形学实验—中点算法画直线

计算机图形学实验报告班级软件1102姓名夏明轩学号20xx09020xx1中点算法的线段光栅化一设计思想和算法流程1假定直线斜率0ltKlt1假定直线斜率0ltKlt1且已确定点亮象素点PXpYp则下一个与直线...

计算机图形学实验指导书

巢湖学院计算机与信息工程学院计算机图形学基础实验指导书主编教师卜华龙上机学时16学时上机学分05学分上机项目数8教学对象10计本教学目标通过系列实验让学生熟练掌握常见图形生成操作如点直线多边形等以及图形变换的相...

湖北工业大学计算机图形学实验代码及截图

计算机图形学OpenGL实验指导书1目录实验一OpenGL基础知识1实验二OpenGL中的建模与变换2实验三OpenGL中的光照5实验四OpenGL中的拾取8实验五OpenGL中的纹理映射112实验一OpenG...

计算机图形学实验

simplecpp黑色背景下画白色矩形includequotstdlibhquotincludequotGLgluthquotvoidinitglClearColor00000010清除背景并设为黑色glCol...

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