实验二

二维及三维图形基本变换的实现

一、实验学时 4学时

二、实验类型 设计型实验

三、实验目的和要求

1、

掌握二维图形变换的原理,对一条直线实现二维基本变换(平移、错切、比例、旋转)。

2、

掌握三维图形变换的原理,画一个立方体,实现对该图形的三维基本变换(平移、错切、比例、旋转)。

四、实验内容

1、画一条直线,实现基本二维图形变换

2、画一个立方体,实现基本的二维图形变换。

五、源代码如下:

二维图形变换:

#include

#include

#include

int initjuzhen(m)

int m[3][3];

{ int i,j;

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

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

m[i][j]=0;

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

m[i][i]=1;

}

main()

{ int

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

int a[3][3];

char key;

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(10,10,"

->:right

^:up

v:down

Esc->exit");

key=getch();

initjuzhen(a);

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

clearviewport();

line(x0,y0,x1,y1);

}

closegraph();

}

三维图形变换:

#include

#include

#include

#include

#include

#include

#define ZOOM_IN

0.9

#define ZOOM_OUT

1.1

int turn1[3];

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;

}

clearviewport();

outtext("\n

-> :right\n

:up\n

v

:down");

moveto(0,10);

outtext("\n page up :zoom

in\n page

down :zoom out\n space

:Redraw\n

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]=0;

turn1[1]=0;

turn1[2]=0;

key=getch();

switch(key)

{ case 77:turn1[0]=1;

break;

case 75:turn1[0]=-1;

break;

case 72:turn1[1]=1;

break;

case 80:turn1[1]=-1;

break;

case 73:turn1[2]=1;

break;

case

81:turn1[2]=-1;

break;

case

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

case 27:

exit();break;

default

:key=0;break;

}

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

}

closegraph();

}

计算机图形学二维图形基本变换实验原理,【实验课件】二维及三维图形基本变换的实现...相关推荐

  1. 计算机大机实验报告,大学计算机一实验报告二大学算机一实验报告二大学计算机一实验报告二大学计算机一实验报告二.doc...

    大学计算机一实验报告二大学算机一实验报告二大学计算机一实验报告二大学计算机一实验报告二 广东金融学院实验报告 课程名称:大学计算机Ⅰ 实验编号 及实验名称实验二中文Word 2010 实验系 别姓 名 ...

  2. 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...

    OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分  .<计算 ...

  3. 计算机图形学基础(OpenGL版)实验四 直线裁剪

    计算机图形学基础 实验四 直线裁剪 1.实验目的: 了解二维图形裁剪的原理(点的裁剪.直线的裁剪.多边形的裁剪),利用VC+OpenGL实现直线的裁剪算法. 2.实验内容: (1) 理解直线裁剪的原理 ...

  4. 计算机图形学头歌实训平台作业OpenGL二维几何变换

    二维几何变换 第1关 正方形的平移与缩放 第2关 正方形的平移和旋转 第3关 正方形的变换组合 第4关 三菱形状 第1关 正方形的平移与缩放 // 提示:写完代码请保存之后再进行评测 #include ...

  5. 计算机图形学三维变换论文,计算机图形学 第5章 三维图形生成和变换技术

    计算机图形学 第5章 三维图形生成和变换技术 (63页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 第五章 目录第五章 三维图形生成和变 ...

  6. 计算机图形学中几何变换的定义,计算机图形学-第5章-几何变换课件

    <计算机图形学-第5章-几何变换课件>由会员分享,可在线阅读,更多相关<计算机图形学-第5章-几何变换课件(70页珍藏版)>请在人人文库网上搜索. 1.计算机图形学-第5章-几 ...

  7. 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...

    计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...

  8. OpenGL学习笔记 - 计算机图形学和现代图形API

    一.计算机图形学 1.简述 wiki上的解释说,"计算机图形学是计算机科学的一个子领域,它研究数字合成和操纵视觉内容的方法.尽管该术语通常指的是对三维计算机图形学的研究,但它也包括二维图形和 ...

  9. 《 线性代数及其应用 (原书第4版)》—— 2.7 计算机图形学中的应用

    本节书摘来自华章出版社< 线性代数及其应用 (原书第4版)>一书中的第2章,第2.7节,作者:(美)戴维C. 雷(David C. Lay)马里兰大学帕克学院 著刘深泉 张万芹 陈玉珍 包 ...

  10. 什么是计算机图形学?(转自中国科学技术大学-刘利刚)

    (如需交流,请关注公众号:神马观止) [注] 由于时常有本科学生来向笔者询问计算机图形学是做什么的,为了使得学生能够快速了解计算机图形学,有利于他们在选择研究生方向做出适合自己的选择,特撰写此文.本文 ...

最新文章

  1. [文档].Altera – SOPC Builder组件开发攻略
  2. html居右显示语言设置,iOS开发:纯代码设置UIButton文字居左或者居右显示
  3. k8s pod内部容器_第三章 pod:运行于kubernetes中的容器
  4. 插入顶部_最快速地把同一内容插入到Word文档不同页面的相同位置
  5. 富文本编辑vue-quill-editor文件上传
  6. unity 开发射击打靶vr_【好玩微信小游戏大全】香肠派对:点开既玩的射击小游戏!正版授权...
  7. java outofmemory怎么解决_java.lang.OutOfMemoryError异常解决方法
  8. 财务记账微信小程序开发
  9. 如何发表一篇计算机领域的顶会论文
  10. Domain Adaptation 简介
  11. 【数学计算】判断两条线段是否相交+计算两条线段的交点和夹角
  12. 使用微信PC端的截图dll库实现微信截图功能(C++ Builder实现)
  13. pandas 转换为文本类型_python – pandas将文本特征转换为数值
  14. 关于element的日历组件改造为考勤页面
  15. wxpython表格怎么分页_Word表格跨页断行如何排版?Word表格换页脱节怎么办?
  16. 如何以信创软硬件来实现隐私计算的大规模产业化,听听冲量怎么说
  17. html5残影,液晶显示器出现残影的原因及解决办法
  18. 如何用Qt抠一个圆形头像出来
  19. login 登陆界面
  20. 【Linux】Linux下基本指令(二)

热门文章

  1. Python Selenium其他使用方法
  2. 大数据是阿猫阿狗都能玩的吗
  3. Python随机游走模型
  4. java jar包签名
  5. 安装Ubuntu后,系统无法上无线网
  6. 小马哥--高仿苹果7p 主板型号9900-875AQ0-A 真实6571芯片刷机拆机主板与开机界面图
  7. 永远的伊苏 2 Mac版 | 适用于MacOS10.15系统的经典游戏《永远的伊苏 2》中文版
  8. matlab与geotiff影像的函数,用法介绍
  9. 打造组织专属即时通信系统,让组织沟通畅快淋漓
  10. 视觉SLAM技术解读