说明报告文档格式.docx
《说明报告文档格式.docx》由会员分享,可在线阅读,更多相关《说明报告文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
实验:
简单物理系统的模拟
二、实验目的及要求
本次上机实践所涉及并要求掌握的知识点
1.运用基本物理知识,编程模拟简单的物理系统。
三、实验环境
本次上机实践所使用的平台和相关软件
Vs2012--openframeworks
四、实验内容
上机实践内容等
编程实现简单的物理系统
五、算法描述及实验步骤
用算法表示方法,流程图等形式表达算法设计思想与算法实现步骤
一:
构建基本的物理系统---存在空气阻力,重力,摩擦力,小球的弹性力,弹簧的阻尼系数。
以及一个额外的鼠标互动弹簧力。
二:
构建功能类:
(1)构建一个参数调节界面XUI
(2)构建一个地面类Ground
(3)构建一个物体(小球)类Orb
三:
构建一个主控类MainControl构建一个完整的程序流程
注:
物理参数由参数调节界面控制
物体类里面有自己的更新函数,完成整个物体系统
物体分裂的实质是:
一开始就定义了四个物体,刚开始只显示一个物体,分裂后才显示所有物体(重新给四个物体分配参数,符合动量守恒定律)
六、调试过程及实验结果
详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果。
OpenframeWorks—VS2012
开始界面,XUI界面可以对一些参数进行基本调控(小球的颜色与它的密度有关,密度越大的小球颜色越浓):
选中小球,调好发射方向,进行蓄力操作(弹簧的宽度与颜色与被拉升的长度有关):
小球发射的过程中,发射的速度和方向都由弹簧蓄力程度方向决定。
小球分裂为四个子物体,根据动量守恒准则:
由于存在空气阻力和地面摩擦力,以及墙壁的弹簧阻尼,所以最终小球会静止:
独个:
分裂后的多个:
鼠标在控制小球互动(小球间具有碰撞检测):
若被鼠标选中,则该小球不会受到重力影响,而是受到一个鼠标的牵引弹性力:
小球碰到墙壁后,会受到一个墙壁的弹簧(符合胡克定理)
存在一些基本的快捷键操作:
1:
可以快速开关重力与空气阻力(模拟太空环境)
2:
小球的分裂也是由按键控制
3:
按键实现重置(方便测试)
七、总结
对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。
这次编程实现了一个比较简陋的物理系统:
1:
具有重力,空气阻力,以及地面的摩擦力,有交互界面可以对系数进行调节
物体间可以相互碰撞
实现了凹凸不平的地面效果
4:
虚拟一个弹簧,给予物体初速度
5:
墙壁的实现时模拟弹簧,只要穿过墙壁就会受到弹力影响(根据胡克定理)
6:
经过测试,整个系统是趋于稳定的
存在问题:
参数调节XUI界面里面使用了中文字符,所以调出参数界面时,帧率会下降,不太利于实时调控(经检测,英文界面没有该问题)
八、附录
源程序(核心代码)清单或使用说明书,可另附纸
本程序没有使用标准的C++规范,很多变量图方便都是直接设为共有变量
本程序有一个主控类:
MainController---用来控制具体的流程.
有三个功能类:
XUI---参数调节界面
Ground---地面
Orb---物体(小球类)---
一个存放全局变量的文件(这里面存放的都是一些物理参数,以及定义几个物体对象)
PhysicParameter.h---里面是一些变量的声明,方便其它类识别
PhysicParameter.cpp---变量的定义,
一个存放工具函数的文件(方便扩展)
MathUtils.h,MathUtils.cpp
核心源码:
主控类:
//setupXUI
this->
XUIFace.reset(newXUI());
XUIFace->
setup();
SetupWorld();
//初始化,包含了所有用到数据的初始化(重置时也是调用了这个函数)
voidMainControl:
:
draw(){
ofBackground(0);
if(IsDividObject)//如果物体分离了
{
for(inti=0;
i<
numBalls;
i++){
orbs[i].update(true);
//--这里面包含了和地面碰撞的函数
//功能和显示分开
orbs[i].display();
}
}//显示分离后的物体完毕
elseif(!
IsDividObject)//只显示一个
orbs[0].update(false);
//--这里面包含了和地面碰撞的函数--参数的意义为单独更新
orbs[0].display();
}//显示初始物体完毕
DrawGround();
//绘制地面
}
地面类:
voidGround:
ground(floatx1,floaty1,floatx2,floaty2)
x1=x1;
y1=y1;
x2=x2;
y2=y2;
x=(x1+x2)/2;
y=(y1+y2)/2;
len=dist(x1,y1,x2,y2);
//地板的长度
rot=atan2((y2-y1),(x2-x1));
//地板与水平面角度
参数调控界面:
XuiMainSet();
//生成一个XUI---里面将一些控件和对应的物理参数绑定
draw();
//实时显示XUI
guiEvent(ofxUIEventArgs&
e)//事件监听函数
物体类:
orb(floatx,floaty,floatr,floatvx,floatvy,floatmass,intidin);
//参数接口函数,定义了物体的一些基本参数
voidOrb:
display();
//显示函数
voidOrb:
update(boolDivided)//物体的更新函数,控制着整个物体的进程
{
//碰撞检测都是离开墙才会有的
if(!
IsObjectInSprings)//物体离开了弹簧才受力,这时才会移动
//鼠标互动
AplyMouseSpring();
//若是存在鼠标互动,则力由鼠标施加
ApplyForce();
//施加外力--如重力
move();
//检测移动
if(Divided)//检测和小球间的碰撞
{collide();
}
CollideWall();
//检测和墙壁的碰撞
//检查地面的碰撞
for(inti=0;
i<
segments;
i++){
CheckGroundCollision(grounds[i]);
else//否则,调用开始弹簧函数
StartSpring();
//检测属否被选中
//只有分离时,才有其它的物体进行判断
if((OverEvent()||ISMove)&
&
(!
Divided||!
otherOver())){
MouseOver=true;
}else{
MouseOver=false;
}
//检测选中完毕