安徽大学计算机实验教学中心PAGE
安徽大学计算机实验教学中心
PAGE 1
学号 专业 姓名
实验日期2018.12.11 教师签字 成绩
实验报告
【实验名称】简单动画的实现、三维图形变换
【实验目的】
指定图形运动轨迹,实现物体的移动过程和移动速度控制;
(2) 理解并掌握形体的投影变换的原理;
【实验原理】
1)简单动画的原理:显示一个对象,然后把它抹去,把这个图形进行变换后,再在新位置予以显示.当上述过程重复执行时,在视觉上便产生了运动;了解 getimage函数和 putimage函数、imagesize函数、malloc 函数、 cleardevice函数的使用。
2)绘制一点透视图的变换矩阵:
1 0 0 0
T= 0 1 0 0
0 0 0 1/d
L m n 1+n/d
得变换后的点坐标为:
x’=(x+l)/(d+(n+z)*d)
y’=(y+m)/(d+(n+z)*d)
z’=0
设计思想
图形的移动
分别画出一个六边形和一个三角形,用两个一维数组p和A来存放其各点坐标;运用putimage(x,y,p,op)函数将六边形不断地向三角形平移,直到到达三角形的边界位置为止。
用到的函数如下:
getimage(x1,y1,x2,y2,p);将屏幕左上角(x1,y1),右下角(x2,y2)的矩形区域内的图象存到指针P所指向的内存区域中。putimage(x,y,p,op);将p所指向的内存区域的内容在屏幕上显示,左上角坐标(x,y)。
一点透视
基本步骤如下:
将三维物体平移到适当位置(l,m,n);
令视点在z轴,进行透视变换,变换矩阵如下:
最后,向xOy面作正投影变换,将结果变换到xOy面上。如此构造的一点透视变换矩阵为:
则三维形体中任意一点(x,y,z)的一点透视变换的齐次坐标计算形式为:
[x’,y’,z’,1]=;
【实验内容】
1.图形的移动显示两个图形,然后移动其中一个图形.当被移动的图形超出屏幕范围时,输
出错误信息“Coordinate out of range”并结束。
#define SHOW_CONSOLE
#include
#include
#include
const int size_x=640,size_y=480;
int main()
{
PIMAGE w;
initgraph(size_x, size_y);//打开一个长640像素,宽480像素的窗口
w = newimage();
circle(100,100,50);
getimage(w,50,50,150,150);
for(int i=0;i<=1000;delay_fps(60),i += 1){
if(i > size_x){
outtextxy(210, 210, "Coordinate out of range");
break;
}
cleardevice();
putimage(i,200,w);
circle(100,100,50);
}
getch();//让屏幕暂停一下
closegraph();//关闭绘图窗口
return 0;
}
2.显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
(选)显示一个立方体的两点透视投影图、斜二测图;(用数组存放正方体的各顶点坐标)。
#define SHOW_CONSOLE
#include "graphics.h" // 引用ege图形库
#include
#include
#include
#include
#include
const int size_x=640,size_y=480;
const double eps = 1e-6;
struct Node{
int x,y,z;
//Node(int a,int b,int c){x=a,b=y,c=z;}
};
std::vector co;
void input()
{
int n,x,y,z;