计算机图形学 实验报告Word格式.docx
《计算机图形学 实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《计算机图形学 实验报告Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
![计算机图形学 实验报告Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/2/dd7f56a0-caa2-4ec7-b102-df82ad107001/dd7f56a0-caa2-4ec7-b102-df82ad1070011.gif)
将她的照片以及表达自己乐观态度的微博内容截屏下来作为素材。
并且配音朗读。
使得flash的内容更加容易打动别人。
3.素材收集。
从XX百科收集她的生平资料,从新浪微博上截取相关内容,找人根据素材进行配音。
4.素材编辑。
(1)使用Photoshop软件将图片拼接起来并进行一些合适flash的缩放。
(2)使用Coolpro2软件将声音文件进行后期。
做成一个音轨。
5.flash的制作
(1)建立一个场景,命名为“封面”,并且在封面中添加背景以及标题文字
(2)利用遮罩层制作文字逐字出现效果
(3)建立新场景,命名为“开场”,同样插入文字和素材
(4)使用补间动画做出图片旋转出现效果
(5)文字使用遮罩层以及补间动画做出淡出和逐字出现效果
(6)新建一个场景,命名为“正文”
输入文案以及使用遮罩层和补间动画制作文字效果
插入微博截图,进行排版,并且利用补间动画制作效果
(7)建立一个新场景,命名为“尾声”,插入文字以及图片内容。
使用遮罩层及补间动画是文字逐字出现。
使用补间动画使图片自下而上缓慢移动。
(8)插入背景及最后总结文字
(9)先打出完整的“天堂里永远都是晴天”的文字。
选中之后打散文字,直至不能打散为止。
然后使用橡皮擦一点一点倒笔画擦除,毎擦除一点就插入一帧关键帧,直至全部擦完。
然后选中,翻转帧。
做出文字书写效果。
每次文字擦除多少决定书写速度。
(10)制作最后结束页。
同样使用遮罩层以及补间动画做出文字效果。
(11)在最后一个场景的最后一帧设置关键帧,并且添加动作“stop();
”使整个flash最后结束停止在这里。
(12)最后在场景“封面”中添加新图层。
导入背景音乐。
(13)测试影片并且导出swf
四、实验总结
当时在微博上看到一个名叫鲁若晴的女孩儿身患白血病,在生病治疗期间,女孩儿坚强的面对病魔,并且积极乐观的接受治疗。
在微博上同步更新着自己每一天的经历。
虽然她最后还是离开了这个世界,但是她的坚强和乐观却深深触动着我。
所以便想到了做这个题目。
在制作过程中也遇到一些不会地方,因为flash是课本上所没有涉及到的部分,所以就一直在网上搜集相关的视频教程,一点一点的摸索,一步一步地跟着实践从而做出了文字逐字效果,图片浅出效果,文字书写效果等。
而配音在找朋友完成之后,音频的处理也是自己摸索实践而做出来的。
将两个人的声轨一点一点分割最后融合在一起,加上背景音乐混缩成一个WAV文件。
最后在添加到flash里后根据音频里的内容修改flash里文字出现的速度,图片停留的时间长度等。
然后根据各方面的修缮最后完成了此次flash的作业。
课程名称计算机图形学实验名称小型绘图系统
一.实验目的
1.设计和开发一个小型的二维绘图系统
2.通过图形软件的设计开发和上机实验,巩固所学图形学基本知识
3.掌握交互式图形系统的设计方法
4.熟悉并掌握有关图形图象编程语言、工具和类库的使用。
二.实验环境
MicrosoftVisualC++6.0
三.实验内容
1.绘制直线
(1)DDA算法的原理
DDA算法是根据直线的微分方程来计算Δx或Δy生成直线的扫描转换算法。
在一个坐标轴上以单位间隔对线段取样,以决定另一个坐标轴方向上最靠近理想线段的整数值。
设(x0,y0)为直线段的始点,(x1,y1)为直线段的终点,且端点坐标均为整数,则直线的微分方程为
设|k|≤1,则有
yi+1=kxi+1+b=k(xi+Δx)+b=yi+kΔx
上式表明,若Δx=1,则当x每递增1时,y递增k。
扫描转换开始时,取直线始点(x0,y0)作为初始坐标。
程序代码:
#include"
stdafx.h"
DDA.h"
MainFrm.h"
DDADoc.h"
DDAView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
BEGIN_MESSAGE_MAP(CDDAApp,CWinApp)
ON_COMMAND(ID_APP_ABOUT,OnAppAbout)
ON_COMMAND(ID_FILE_NEW,CWinApp:
:
OnFileNew)
ON_COMMAND(ID_FILE_OPEN,CWinApp:
OnFileOpen)
END_MESSAGE_MAP()
CDDAApp:
CDDAApp()
{
}
CDDAApptheApp;
BOOLCDDAApp:
InitInstance()
AfxEnableControlContainer();
#ifdef_AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
SetRegistryKey(_T("
LocalAppWizard-GeneratedApplications"
));
LoadStdProfileSettings();
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CDDADoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CDDAView));
AddDocTemplate(pDocTemplate);
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
m_pMainWnd->
ShowWindow(SW_SHOW);
UpdateWindow();
returnTRUE;
classCAboutDlg:
publicCDialog
public:
CAboutDlg();
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
CAboutDlg():
CDialog(CAboutDlg:
IDD)
voidCAboutDlg:
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
voidCDDAApp:
OnAppAbout()
CAboutDlgaboutDlg;
aboutDlg.DoModal();
(2)Bresenham算法的原理
Bresenham画线算法与中点画线法有相似之处,也是通过在每列像素中确定与理想直线最近的像素来进行直线的扫描转换的。
为了讨论的方便,不妨也假定直线的斜率在0~1之间。
如图所示,过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与该交点最近的像素。
Bresenham算法误差项d的几何意义
BresenhamLine.h"
BresenhamLineDoc.h"
BresenhamLineView.h"
BEGIN_MESSAGE_MAP(CBresenhamLineApp,CWinApp)
CBresenhamLineApp:
CBresenhamLineApp()
CBresenhamLineApptheApp;
BOOLCBresenhamLineApp:
LoadStdProfileSettings();
RUNTIME_CLASS(CBresenhamLineDoc),
RUNTIME_CLASS(CBresenhamLineView));
DECLARE_MESSAGE_MAP()
voidCBresenhamLineApp:
屏幕截图:
2.绘制圆
算法原理
为了讨论的方便,我们考虑中心在原点,半径为R的圆的第二个八分圆弧,圆的其它部分可通过一系列的简单的反射变换得到。
也就是讨论如何从(0,R)到顺时针确定最佳逼近于该圆弧的像素序列。
中心在原点,半径为R的圆的方程为
x2+y2=R2
若令F(x,y)=x2+y2-R2,则上述方程为
F(x,y)=0
如图所示,假定x坐标为xP的像素中最佳逼近理想圆弧的为P(xP,yP),那么,下一个像素只能是正右方的P1(xP+1,yP)或右下方的P2(xP+1,yP-1)两者之一。
引入P1和P2的中点M(xP+1,yP-0.5),当M在圆内时,应取P1(xP+1,yP)为下一个像素,否则,应取P2(xP+1,yP-1)为下一个像素。
为此,构造判别式
d=F(M)=F(xP+1,yP-0.5)=(xP+1)2+(yP-0.5)2-R2
中点画圆法
若d<
0,则应取P1(xP+1,yP)为下一个像素,而且再下一个像素的判别式为
d′=F(xP+2,yP-0.5)=(xP+2)2+(yP-0.5)2-R2=d+2xP+3
而d≥0,则应取P2(xP+1,yP-1)为下一个像素,而且再下一个像素的判别式为
d′=F(xP+2,yP-1.5)=(xP+2)2+(yP-1.5)2-R2=d+2(xP-yP)+5
由于第一个像素是(0,R),因而d的初始值为
d0=F(1,R-0.5)=1.25-R
MidBresenhamCircle.h"
MidBresenhamCircleDoc.h"
MidBresenhamCircleView.h"
BEGIN_MESSAGE_MAP(CMidBresenhamCircleApp,CWinApp)
CMidBresenhamCircleApp:
CMidBresenhamCircleApp()
CMidBresenhamCircleApptheApp;
BOOLCMidBresenhamCircleApp:
RUNTIME_CLASS(CMidBresenhamCircleDoc),
RUNTIME_CLASS(CMidBresenhamCircleView));
if(!
voidCMidBresenhamCircleApp:
3.绘制椭圆
中点画圆法可以推广到一般二次曲线的生成,下面以中心在原点的标准椭圆的扫描转换为例说明。
设椭圆的方程为
F(x,y)=b2x2+a2y2-a2b2=0
其中,a为沿x轴方向的长半轴长度,b为y轴方向的短半轴长度,a、b均为整数。
不失一般性,我们只讨论第一象限椭圆弧的生成。
需要注意的是,在处理这段椭圆时,必须以弧上斜率为-1的点(即法向量两个分量相等的点)作为分界把它分为上部分和下部分,如图所示。
第一象限的椭圆弧
该椭圆上一点(x,y)处的法向量为
其中,i和j分别为沿x轴和y轴方向的单位向量。
从图3.6可看出,在上部分,法向量的y分量更大,而在下部分,法向量的x分量更大,因而,在上部分若当前最佳逼近理想椭圆弧的像素(xP,yP)满足下列不等式
b2(xP+1)<a2(yP-0.5)
而确定的下一个像素不满足上述不等式,则表明椭圆弧从上部分转入下部分。
在上部分,假设横坐标为xP的像素中与椭圆弧更接近点是(xP,yP),那么下一对候选像素的中点是(xP+1,yP-0.5)。
因此判别式为
d1=F(xP+1,yP-0.5)=b2(xP+1)2+a2(yP-0.5)2-a2b2
若d1<
0,中点在椭圆内,则应取正右方像素,且判别式应更新为
d1=F(xP+2,yP-0.5)=b2(xP+2)2+a2(yP-0.5)2-a2b2=d1+b2(2xP+3)
当d1≥0,中点在椭圆之外,这时应取右下方像素,并且更新判别式为
d1=F(xP+2,yP-1.5)=b2(xP+2)2+a2(yP-1.5)2-a2b2=d1+b2(2xP+3)+a2(-2yP+2)
由于弧起点为(0,b),因此,第一中点是(1,b-0.5),对应的判别式是
d10=F(1,b-0.5)=b2+a2(b-0.5)2-a2b2=b2+a2(-b+0.25)
在下部分,应改为从正下方和右下方两个像素中选择下一像素。
如果在上部分所选择的最后一像素是(xP,yP),则下部分的中点判别式d2的初始值为
d20=F(xP+0.5,yP-1)=b2(xP+0.5)2+a2(yP-1)2-a2b2
d2在正下方向与右下方向的增量计算与上部分类似,这里不再赘述。
下部分弧的终止条件是y=0。
voidBresenham2Circle(GLsizeia,GLsizeib,GLsizeinum)
glColor3f(1.0f,0.0f,0.0f);
if(num==1)
{
printf("
Bresenham算法画椭圆:
各点坐标及判别式的值\n"
);
}
elseif(num==0)
return;
GLsizeix,y;
floatd1,d2;
x=0;
y=b;
d1=b*b+a*a*(-b+0.5);
putpixel(x,y);
putpixel(-x,-y);
putpixel(-x,y);
putpixel(x,-y);
while(b*b*(x+1)<
a*a*(y-0.5))
if(x>
=num-1)
{
printf("
x=%d,y=%d,d1=%d\n"
x,y,d1);
break;
}
if(d1<
=0)
d1+=b*b*(2*x+3);
x++;
else
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
y--;
putpixel(x,y);
putpixel(-x,-y);
putpixel(-x,y);
putpixel(x,-y);
}//while上半部分
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while(y>
0)
x=%d,y=%d,d2=%d\n"
x,y,d2);
if(d2<
d2+=b*b*(2*x+2)+a*a*(-2*y+3);