目录
(一)准备工作
(二)项目开发,Q&A
- body类
- 计算距离
- 计算给定星体施加给传入星体的力
- 计算力在x和y方向上的分量
- 计算在星系网的环境下对行星施加的力
- 更新星体的加速度,速度,位置
- 开始编写NBody,首先读入宇宙的半径
- 读取文件中星体的属性并以对象数组返回
- 绘制宇宙状态,动画化(四步骤)
- 动起来!
(三)效果展示
(四)结项总结以及近日思考
2/2更新:,伯克利要求do not share your code or post code online.所以代码部分会删除。
(一)准备工作:
1.git clone skeleton-sp19到本地
(二)项目开发,遇到的问题及解决办法
(1)body类
需要你构建一个body.class,表示的是各种星体,这个body具有以下属性:
/**
* Body类,表示星体的信息
*
* double xxPos:其当前x位置
* double yyPos:其当前y位置
* double xxVel:当前在x方向上的速度
* double yyVel:当前的y方向速度
* double mass:其质量
* String imgFileName:与描述正文的图像相对应的文件名(例如jupiter.gif)
*
*/
需要写两个构造函数,第一个是的参数为6个值,第二个的参数为一个body对象,构造函数的作用是给成员变量赋值
当前body类:
通过项目测试:
Question:
1.我想对带有构造器的body类进行测试,但是skeleton-sp19中的后续测试文件会报错,在idea环境中如何只运行一个java class而不运行整个项目呢?
使用了博主的方法,修改了Seting中和Run configurations中的两个选项,解决了该问题,测试通过。
后续:每次运行新的测试类都需要改该类中edit configuration的build->build,no error check.心累
(2)计算距离
因为是仿真,所以需要厘清物理公式
dx/dr即cosθ
这些公式会在之后的method中用到
首先要计算所给定的星体和要进行计算的星体之间的距离;
没啥问题,通过测试:
(3)计算给定星体施加给传入星体的力
代码规范好像不太行QAQ,hint中提示可以设置常量和使用科学计数法表示G
没啥问题,通过测试
(4)计算力在x和y方向上的分量
没啥问题,通过测试:
Attention
这个方法虽然通过了Unit Test,但是在最后展示动画的时候发现还是有错,详情请看 (10)动起来!
(5)计算在星系网的环境下对行星施加的力
Qusetion:
1.method的parameter中要传入Body类构成的array,如何表示?
解决:Body[] bodys。
2.传入的星体如何和自己对比呢?换句话说,怎么表示自己这个类(没有名字)?
解决:直接使用this关键字。
通过测试:
(6)更新星体的加速度,速度,位置
简单的公式啦~
没啥问题,通过测试
至此物理仿真的过程已经结束
(7)开始编写NBody,首先读入宇宙的半径
使用In类中的方法来完成此功能,参考了example中的BasicInDemo
没啥问题,通过测试
(8)读取文件中星体的属性并以对象数组返回
这个方法真是妙啊,将之前设置的 constructor用上了,一开始我还以为是返回String array,后来寻思不对啊,应该是要返回Object array.并且every object has been instantiated and collected by Body array.这样这个数组中就包括了星体的所有信息
Question:
1.返回的是行星名组成的String array吗?
不是,是Body[] 啊铁汁。它是包括各种属性的。
(9)绘制宇宙状态,动画化(四步骤)
Step1:收集数据
Step2:画出宇宙背景
Step3:在Body类中draw
Step4:在NBody中画出每一个body(利用之前的bodys array)
(10)动起来!
按照教程指示走
完工后出了一个BUG,那就是太阳系的行星按照初速度逃离了太阳系,这是为什么呢?命名之前所有的Unit Test已经通过了,还会有Bug出现?最终多方探寻,找到了一个很奇葩的错误,在计算x和y方向上的的分力的时候有错,想想二维坐标系就懂的为什么了
* log:运行不成功,星体逃离了太阳系 * 为什么呢?原先是this.xxPos-body.xxPos * 之后为了防止出现负数而使用三目运算符把他变正 * * 后来改成body.xxPos-this.xxPos就好了,我滴龟龟,这是为什么? * 因为以中心设立了坐标系呀!铁汁,你咋能是恒正呢?恒正人家当然正向跑了呀
修改后的method:
(三)效果展示
至此,CS61B_Project 0基本完结,以下为效果图:
若修改传入main方法的参数,还可以调度其他文件,我就不一一列举了。
(四)结项总结以及近日思考
在写项目的时候断断续续处理了很多事情,满打满算花了两天的工时。在去年年中听说了国外四大的CS课很多都是神课,可惜我知道这个消息的时候有些迟了,如果能在大一大二的时候就学习这些课程就好了。
Project0并没有涉及到DS方面的内容,可以把它看作是为了熟悉java而设置的一个入门项目,项目提供的脚手架很多,以至于我们只需要按部就班do some code就可以得到最终的效果。啥时候我也能自己从零开始构建一个不小的项目呢?Project0总体来说挺有意思的,CS61B的重点还是之后的几个项目嗷。
去年一年都在忙考研的事,可惜结果不理想,虽说成功不必在我,但功必不唐捐,奋力奔跑的结果若是不能尽如人意,披荆斩棘的过程也会让人受益良多——自我av罢了,总归是很难受的哈哈!不过这一段时间的调整让我更能认清自己,“认识你自己”是非常重的五个字,我现在会比之前的认识更深刻一些吧。失败可怕吗?可怕。尤其是这样时间成本以及机会成本大的失败往往对于彼时彼刻的我是很难以承受的。但是失败也有其价值,跌得越痛,醒的越深,失败中暴露的问题是我们要重视的。对自我的剖析,对事物更替的感知,岁月勾沉的重量,未来的道路往何处落脚之类的思考是前段时间是脑海中不断浮现的话题。谨慎思考,做出选择,承担责任,现在做好了二战的决定,那就为自己的未来搏一把吧!
向前看。