说明报告文档格式.docx

上传人:b****6 文档编号:21932667 上传时间:2023-02-01 格式:DOCX 页数:9 大小:178.25KB
下载 相关 举报
说明报告文档格式.docx_第1页
第1页 / 共9页
说明报告文档格式.docx_第2页
第2页 / 共9页
说明报告文档格式.docx_第3页
第3页 / 共9页
说明报告文档格式.docx_第4页
第4页 / 共9页
说明报告文档格式.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

说明报告文档格式.docx

《说明报告文档格式.docx》由会员分享,可在线阅读,更多相关《说明报告文档格式.docx(9页珍藏版)》请在冰豆网上搜索。

说明报告文档格式.docx

实验:

简单物理系统的模拟

二、实验目的及要求

本次上机实践所涉及并要求掌握的知识点

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;

}

//检测选中完毕

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1